通过在列表上进行交互来取消选择类实例

时间:2016-08-16 20:48:30

标签: python class filenames pickle

我试图通过迭代包含所有类实例的列表来解压缩保存在单独的.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。

最后一点 - 请不要问我为什么这样做。相反,帮助我解决和解决问题,所以我可以使它工作,并了解发生了什么。赞赏:))

1 个答案:

答案 0 :(得分:0)

你得到的NameError是Python告诉你你正在尝试使用尚未定义的变量。

在此行中使用之前,您没有定义SausageAubergineRagu

globals()[SausageAubergineRagu] = pickle.load(f)

在第一个示例中,您要向globals添加键和值。您正在使用配方实例(each)作为键,并将pickled数据用作值。

在第二个示例中,您尝试执行相同的操作,但不是使用配方实例(each)作为键,而是使用SausageAubergineRagu,这是未定义的。

Python如何知道SausageAubergineRagu是什么?如果您希望该行有效,则需要先定义它,或者使用已定义的内容,例如each,这是您在其他代码段中执行的操作。

老实说,使用自定义类的实例作为globals中的键似乎对我来说很奇怪(通常是人们使用字符串),但是因为你显然想让它工作,答案很简单:

在尝试将其用作词典中的键之前定义SausageAubergineRagu