python - 在 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
解决方案
正如这个答案所建议的那样,您可以尝试设置setup_iprotect_session
为staticmethod
班级,然后您就不会遇到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)
推荐阅读
- database - 从事微软访问项目。当我尝试打开表单时收到错误“查询必须有一个目标字段”
- python - 在每个 n 位置将一个列表的值插入另一个列表
- rust - Rust 有没有办法在不生成代码的情况下执行语法和语义分析?
- java - 未正确返回 Windows 上文件路径的短名称
- angularjs - AngularJS ng-class 有两个类并缩短 ES6 if
- oop - 哪个 OOP 概念描述了一个类如何改变或定制从父类继承的行为?
- reactjs - 使用条件格式检查验证表单输入
- android - 我想使用python通过rest api检索firebase分析(事件数据)
- python - 创建一个返回递增序列的函数
- mysql - 在 MySQL 中同时使用 AUTO_INCREMENT 和 PRIMARY KEY 有什么意义?