我使用装饰器来验证到达函数的参数(通过字典对象),当我有两个或更多的键时,它工作得很好。但是,如果只有键,它将返回一个错误(check_person)。我定义了两个函数来说明我的问题:
def required(**mandatory):
"""
:param mandatory:
:return:
"""
def decorator(f):
@wraps(f)
def wrapper(**dicts):
for argname, d in dicts.items():
for key in mandatory.get(argname, []):
if key not in d:
raise Exception('Key "%s" is missing from argument "%s"' % (key, argname))
return f(**dicts)
return wrapper
return decorator
@required(json_request=(_PROVIDER, _REPORT))
def check_campaign(json_request):
"""
:param json_request:
:return:
"""
return True
@required(json_request=(_NAME))
def check_person(json_request=None):
"""
:param json_request:
:return:
"""
return True我需要将check_person更改为:
if _NAME in json_request:
return True
return False让它发挥作用。
当我尝试:
self.assertTrue(validator.check_person(json_request=json.loads("""{"name": "Elon Musk"}""")))或具体而言:
{"name": "Elon Musk"}我得到:
Error
Traceback (most recent call last):
File "/Users/spicyramen/Documents/OpenSource/Development/Python/gonzo/utils/validate/validator_test.py", line 46, in test_person
self.assertTrue(validator.check_person(json_request=json.loads("""{"name": "Elon Musk"}""")))
File "/Users/spicyramen/Documents/OpenSource/Development/Python/gonzo/utils/validate/validator.py", line 26, in wrapper
raise Exception('Key "%s" is missing from argument "%s"' % (key, argname))
Exception: Key "n" is missing from argument "json_request"当我的字典有超过一个键时,它可以正常工作(如check_campaign)。
发布于 2017-05-13 09:02:55
问题是语法上的细微区别。
对于@required(json_request=(_PROVIDER, _REPORT)),您的请求是一个元组:(_PROVIDER,_REPORT)。
相反,在失败的示例@required(json_request=(_NAME))中,请求只是值_NAME。要使它成为一个元组,添加一个逗号:@required(json_request=(_NAME,))。这应该能解决你所有的麻烦。
至于你为什么得到这个准确的错误,你会反复考虑这个参数。当它是元组的时候,它会按照你的意愿工作。当它是一个字符串时,遍历它就会得到每个字母。这就是'n'丢失的原因:它是'name'的第一个字母。
https://stackoverflow.com/questions/43950932
复制相似问题