首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Decorator验证

Python Decorator验证
EN

Stack Overflow用户
提问于 2017-05-13 08:27:13
回答 1查看 983关注 0票数 1

我使用装饰器来验证到达函数的参数(通过字典对象),当我有两个或更多的键时,它工作得很好。但是,如果只有键,它将返回一个错误(check_person)。我定义了两个函数来说明我的问题:

代码语言:javascript
复制
    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更改为:

代码语言:javascript
复制
if _NAME in json_request:
        return True
    return False

让它发挥作用。

当我尝试:

代码语言:javascript
复制
self.assertTrue(validator.check_person(json_request=json.loads("""{"name": "Elon Musk"}""")))

或具体而言:

代码语言:javascript
复制
{"name": "Elon Musk"}

我得到:

代码语言:javascript
复制
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)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-13 09:02:55

问题是语法上的细微区别。

对于@required(json_request=(_PROVIDER, _REPORT)),您的请求是一个元组:(_PROVIDER,_REPORT)。

相反,在失败的示例@required(json_request=(_NAME))中,请求只是值_NAME。要使它成为一个元组,添加一个逗号:@required(json_request=(_NAME,))。这应该能解决你所有的麻烦。

至于你为什么得到这个准确的错误,你会反复考虑这个参数。当它是元组的时候,它会按照你的意愿工作。当它是一个字符串时,遍历它就会得到每个字母。这就是'n'丢失的原因:它是'name'的第一个字母。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43950932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档