首页 > 解决方案 > 为什么系统说 :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:名称“自我”未定义

如何解决这个问题呢?

标签: python

解决方案


列表推导有自己的局部变量范围。evalcan't see self,因为self来自外部范围,并且没有任何东西会触发eval查看变量所必需的闭包变量机制。(selfin 的引用self.file_vars不会触发它,因为该表达式是在列表理解的范围之外评估的,尽管它是列表理解的一部分。)

停止使用eval。这是危险的,几乎总是一个坏主意,对于这样的事情完全没有必要。适当的替换工具可能包括getattrself.__dict__或其他东西,具体取决于您的完整用例的样子。


推荐阅读