簡體   English   中英

Python 裝飾器檢查 function 的所有參數,其中可能包含一個列表

[英]Python decorator to check all parameters of a function which may include a list

我正在嘗試實現裝飾器 function 來清理mongoDB的參數。 這是我到目前為止所擁有的:

def sanitize(function_to_decorate):
    def wrapper(*args):
        for query in args:
            if any(elem in r'${/}\\' for elem in query):
                raise Exception('String contains invalid characters')
        function_to_decorate(*args)
    return wrapper

@sanitize
def test(arg, arg2, list):
    print (arg, arg2, list) 

test('Hi', 'Me', '1') # Passes
test('Hi', 'Me', '{1') # Fails
test('Hi',  'Hey', ['Me', '{1']) # Passes

這是有道理的,因為我只對所有參數進行一次迭代,但由於某些函數可能需要列表作為參數(例如,對於 $in 檢查),這並不是普遍有用的。

如何向下鑽取列表中任意數量的列表?

def a(str, str, [] )
def b([], [] ,[])

我也不知道如何為關鍵字 arguments 實現此功能,但這是裝飾器特定的問題。

您可以將檢測參數的責任交給 function 遞歸地檢查它們:

def rsanitize(args):
    for query in args:
        if isinstance(query, list):
            rsanitize(query)
        elif any(elem in r'${/}\\' for elem in query):
            raise Exception('String contains invalid characters')
    
def sanitize(function_to_decorate):
    def wrapper(*args):
        rsanitize(args)
        function_to_decorate(*args)
    return wrapper

現在您的最終測試用例將正常失敗:

Traceback (most recent call last):
  File "D:\xxx\soRecursivelyTestLists.py", line 22, in <module>
    test('Hi',  'Hey', ['Me', '{1']) # Passes
  File "D:\xxx\soRecursivelyTestLists.py", line 12, in wrapper
    rsanitize(args)
  File "D:\xxx\soRecursivelyTestLists.py", line 6, in rsanitize
    rsanitize(query)
  File "D:\xxx\soRecursivelyTestLists.py", line 8, in rsanitize
    raise Exception('String contains invalid characters')
Exception: String contains invalid characters

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM