python - 为什么系统说 :NameError: name 'self' is not defined
问题描述
我的代码是这样的:
class NN(object):
def __init__(self,config=None,opts=None):
self.file_vars = ['self.corpusfile','self.dbfile']
self.corpusfile="data.json"
self.dbfile="db.json"
def saveNet(self):
for name in self.file_vars:
print(name)
print(eval(name))
b=dict( [(name,eval(name)) for name in self.file_vars])
a=NN()
a.saveNet()
结果是:
self.corpusfile
data.json
self.dbfile
db.json
错误信息是:
NameError:名称“自我”未定义
如何解决这个问题呢?
解决方案
列表推导有自己的局部变量范围。eval
can't see self
,因为self
来自外部范围,并且没有任何东西会触发eval
查看变量所必需的闭包变量机制。(self
in 的引用self.file_vars
不会触发它,因为该表达式是在列表理解的范围之外评估的,尽管它是列表理解的一部分。)
停止使用eval
。这是危险的,几乎总是一个坏主意,对于这样的事情完全没有必要。适当的替换工具可能包括getattr
、self.__dict__
或其他东西,具体取决于您的完整用例的样子。
推荐阅读
- java - 具有动态属性名称的 Java 中的 JSON 反序列化
- laravel - 删除雄辩的关系laravel
- spring-boot - gradle - spring boot 无法识别 - 无法为任务“:bootJar”设置未知属性“archiveFileName”
- c++ - FFmpeg 从 H264 比特流中解析 NAL
- javascript - 从外部页面打开引导模式(在它所在的页面上)
- r - 在 GraphPad Prism 中使用 R 样式数据
- go - 如何使用加密/rc4
- html - 如何在谷歌工作表侧边栏插件中添加超链接到单元格
- ruby-on-rails - 有轨道保存的 mongoid 替代品(触摸:假)
- wpf - 如何绘制某个形状并将其放置在wpf中文本框内的文本旁边