首页 > 解决方案 > 在 python 中调用装饰器时出现 NameError

问题描述

NameError: name 'setup_iprotect_session' is not defined即使它存在于同一个类中,我也会在调用装饰器时得到它。

我试图删除这个self论点,但它没有多大帮助。

我在这里做错了吗?

装饰器

class Synchronize(Resource):
    def get(self):
        self.get_lastcardusage()

    @setup_iprotect_session()
    def get_lastcardusage(self):
        self.iprotect_client.post('SELECT RCN FROM ACCESSKEY')

    def setup_iprotect_session(self):
        def decorator(func):
            @wraps(func)
            def wrapper(*args, **kwargs):
                self.iprotect_client = IProtect()
                self.iprotect_client.authenticate()
                func(*args, **kwargs)
                self.iprotect_client.logout()
            return wrapper
        return decorator

完整回溯

Traceback (most recent call last):
  File "wsgi.py", line 1, in <module>
    from app import app
  File "/Users/om/app/__init__.py", line 27, in <module>
    from .iprotect_api.views import iprotect_api
  File "/Users/om/iprotect_api/views.py", line 15, in <module>
    from .synchronize import Synchronize, LastSync, Keepalive
  File "/Users/om/iprotect_api/synchronize.py", line 13, in <module>
    class Synchronize(Resource):
  File "/Users/om/iprotect_api/synchronize.py", line 71, in Synchronize
    @setup_iprotect_session()
NameError: name 'setup_iprotect_session' is not defined

标签: pythonpython-decorators

解决方案


正如这个答案所建议的那样,您可以尝试设置setup_iprotect_sessionstaticmethod班级,然后您就不会遇到self未定义的问题

class Synchronize(Resource):
    def get(self):
        self.get_lastcardusage()

    def setup_iprotect_session(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            self.iprotect_client = IProtect()
            self.iprotect_client.authenticate()
            func(*args, **kwargs)
            self.iprotect_client.logout()

        return wrapper

    @setup_iprotect_session
    def get_lastcardusage(self, a, b=None):
        self.iprotect_client.post('SELECT RCN FROM ACCESSKEY')

    setup_iprotect_session = staticmethod(setup_iprotect_session)

推荐阅读