[英]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.