我试图通过迭代包含所有类实例的列表来解压缩保存在单独的.pkl文件中的各种类实例(每个类实例在实例化时将其自身附加到适当的列表)。
有效:
# LOAD IN INGREDIENT INSTANCES
for each in il:
with open('Ingredients/{}.pkl'.format(each), 'rb') as f:
globals()[each] = pickle.load(f)
例如,一种成分是Aubergine
:
print(Aubergine)
输出:
Name: Aubergine
Price: £1.00
Portion Size: 1
但是,不起作用:
# LOAD IN RECIPE INSTANCES
for each in rl:
with open('Recipes/{}.pkl'.format(each.name), 'rb') as f:
globals()[each] = pickle.load(f)
我只能假设问题源于each.name
用于配方的文件名,而each
用于配料文件名。然而,这是有意的,因为食谱的name
属性是为最终用户格式化的(即包含空格等)。我认为这可能是问题,但我不确定。
成分和配方类都使用:
def __repr__(self):
return self.name
例如:
我有一个食谱类实例SausageAubergineRagu
,其中self.name
为'Sausage & Aubergine Ragu'
,这位于列表rl
内。我试过单独测试一下:
输入:
rl
输出:
[Sausage & Aubergine Ragu]
所以我相信这段代码:
# LOAD IN RECIPE INSTANCES
for each in rl:
with open('Recipes/{}.pkl'.format(each.name), 'rb') as f:
globals()[each] = pickle.load(f)
......应该导致:
with open('Recipes/Sausage & Aubergine Ragu.pkl', 'rb') as f:
globals()[SausageAubergineRagu] = pickle.load(f)
但是尝试访问配方类实例会导致NameError。
最后一点 - 请不要问我为什么这样做。相反,帮助我解决和解决问题,所以我可以使它工作,并了解发生了什么。赞赏:))
答案 0 :(得分:0)
你得到的NameError
是Python告诉你你正在尝试使用尚未定义的变量。
在此行中使用之前,您没有定义SausageAubergineRagu
:
globals()[SausageAubergineRagu] = pickle.load(f)
在第一个示例中,您要向globals
添加键和值。您正在使用配方实例(each
)作为键,并将pickled数据用作值。
在第二个示例中,您尝试执行相同的操作,但不是使用配方实例(each
)作为键,而是使用SausageAubergineRagu
,这是未定义的。
Python如何知道SausageAubergineRagu
是什么?如果您希望该行有效,则需要先定义它,或者使用已定义的内容,例如each
,这是您在其他代码段中执行的操作。
老实说,使用自定义类的实例作为globals
中的键似乎对我来说很奇怪(通常是人们使用字符串),但是因为你显然想让它工作,答案很简单:
在尝试将其用作词典中的键之前定义SausageAubergineRagu
。