我的代码是这样的:
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:名称'self'未定义
如何解决这个问题?
答案 0 :(得分:3)
列表理解具有其自身的局部变量范围。 eval
无法看到self
,因为self
来自外部作用域,并且没有任何触发eval
看到变量的闭包变量机制。 (self
中的self.file_vars
引用不会触发它,因为尽管该表达式是列表推导的一部分,但该表达式是在列表推导的范围之外求值的。)
使用eval
停止。这很危险,几乎总是一个坏主意,而对于这样的事情完全没有必要。适当的替换工具可能包括getattr
,self.__dict__
或其他内容,具体取决于您的完整用例。