Python 装饰器验证

戈加斯卡

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

    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"

当我的字典有 1 个以上的键时,它工作正常(如 check_campaign)。

艾莉亚·麦卡锡

问题在于微妙的语法区别。

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

相比之下,在您失败的示例中@required(json_request=(_NAME)),请求只是值_NAME要使其成为元组,请添加逗号:@required(json_request=(_NAME,))那应该能解决你所有的烦恼。


至于为什么你会得到那个确切的错误,你遍历参数。当它是一个元组时,它可以按您的意愿工作。当它是一个字符串时,遍历它会得到每个字母。这就是'n'丢失的原因:它是'name'.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章