2016-08-16 3 views
-2

Я пытаюсь распаковать различные экземпляры классов, которые сохраняются в отдельных файлах .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) в качестве ключей, а маринованные данные - как значения.

В вашем втором примере вы пытаетесь сделать то же самое, но вместо использования экземпляров рецептов (each) в качестве ключей вы используете SausageAubergineRagu, что не определено.

Как Python должен знать, что такое SausageAubergineRagu? Если вы хотите, чтобы эта строка работала, вам нужно сначала определить ее или использовать то, что уже определено, например each, что и вы делаете в другом фрагменте.

Честно говоря, используя экземпляры пользовательских классов в качестве ключей в globals кажется странным для меня в любом случае (как правило, люди используют строки), но так как вы, очевидно, хотите, чтобы заставить его работать, ответ прост:

Определение SausageAubergineRagu перед попыткой использовать его в качестве ключа в словаре.

+0

Я пытаюсь определить его. В этом весь смысл. Он работает с классом ингредиентов, но не с классом рецептов. В моем вопросе я продемонстрировал экземпляр экземпляра класса ингредиентов «Aubergine», который был успешно распущен. –

+0

@JakeStokes Посмотреть мое редактирование. Я добавил некоторые подробности. – ballsatballsdotballs

+0

Итак, это объясняет ошибку имени, в которой я пытался написать код, но когда он все еще использует 'each', он все равно не работает. Если я запускаю код и вызываю класс, он говорит, что он не определен. Есть идеи? –