【问题标题】:How to use a function variable from **kwargs in python?如何在python中使用**kwargs中的函数变量?
【发布时间】:2014-04-08 12:32:41
【问题描述】:

我正在尝试执行以下操作,但遇到异常 NameError("global name 'rid' is not defined",

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):
    ...

【问题讨论】:

    标签: python decorator python-decorators


    【解决方案1】:

    您将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 字典中找到该值;仅当您使用 rid=rid 参数调用 add_booking 时,它才会被放置在那里。通过在装饰器包装函数中使用显式 rid 参数,可以确保它始终绑定到 rid 名称。

    【讨论】:

    • 谢谢!如果我需要摆脱可选怎么办?最好的方法是定义 _safe_forcecall(self, rid=None, ...) 然后检查它是否不是 None?
    • @AviMeir:在您的装饰函数中,rid 不是可选的。那将是您的第一个呼叫端口,使其成为具有默认值的关键字参数。然后你可以测试看看它是否通过if 'rid' in kwargs传递到你的装饰器包装器中。
    • 好吧,假设我想更改它以使其成为可选。我可以这样做吗?最好的做法是改为: if 'rid' in kwargs: lcode = kwargs['rid'] else: lcode = 0
    • @AviMeir:你会使用lcode = kwargs.get('rid', 0),例如向字典询问密钥,如果未设置,请指定默认值。
    猜你喜欢
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    相关资源
    最近更新 更多