如何在python中使用** kwargs的函数变量?

时间:2014-04-08 12:32:41

标签: python decorator python-decorators

我正在尝试执行以下操作,但遇到异常 NameError("全局名称' rid'未定义"

def safe_forcecall(fn):
    def _safe_forcecall(self, *args, **kwargs):
        if self._token_valid(rid) is not None:
            return fn(self, *args, **kwargs)
    return _safe_forcecall


@safe_forcecall
def add_booking(self, rid, data):
    ...

1 个答案:

答案 0 :(得分:4)

您正在传递rid作为位置参数,因此可以在args中找到:

if self._token_valid(args[0]) is not None:

如果您的装饰者总是需要访问该参数,只需明确命名:

def safe_forcecall(fn):
    def _safe_forcecall(self, rid, *args, **kwargs):
        if self._token_valid(rid) is not None:
            return fn(self, rid, *args, **kwargs)
    return _safe_forcecall

您在kwargs字典中找不到该值;只有当您使用add_booking参数调用rid=rid时,它才会放在那里。通过在装饰器包装函数中使用显式rid参数,可以确保它始终绑定到rid名称。