Python: ошибка атрибута с полкой при использовании 2 модулей py

Я пробую модуль полки, и у меня возникают проблемы. Мое намерение состоит в том, чтобы один модуль вызывал функцию во втором, которая будет изменять файл внутри полки. Я сделал прототип (ниже), который просто пытается установить переменную на что-то, хранящееся на полке, и распечатать этот объект.

Когда я пытаюсь сделать это, я получаю следующую ошибку атрибута:

AttributeError: 'module' object has no attribute 'User'

Я предполагаю, что он не понимает, что мой класс «Пользователь» существует, но я не уверен, почему. File1 вызывает ту же функцию, что и File2, в своей основной функции, и в этом случае она работает правильно. Я был бы признателен за любую помощь с этой проблемой, я смущен тем, в чем проблема.

import SE_ex2

SE_ex2.cacheTest()

import shelve

cache_users = shelve.open("usersTest.cache")

class User(object):
    def __init__(self, name, num):
        self.name = name
        self.num = num

    def __str__(self):
        return "Name:{0}, Num={1}".format(self.name, self.num)

def cacheTest():
    obj = cache_users[ "user_red" ]
    print obj

if __name__ == "__main__":
    cacheTest()

#Used for creating the cache for the first time
#    red = User("red", 11)
#    green = User("green", 22)
#    blue = User("blue", 33)
#
#    cache_users['user_red'] = red
#    cache_users['user_green'] = green
#    cache_users['user_blue'] = blue
#    print "DONE"

Полная обратная связь:

Traceback (most recent call last):
  File "C:\Users\akaGrim\My Documents\Aptana Studio 3 Workspace\ShelveTest\SE_ex1.py", line 3, in <module>
    SE_ex2.cacheTest()
  File "C:\Users\akaGrim\My Documents\Aptana Studio 3 Workspace\ShelveTest\SE_ex2.py", line 14, in cacheTest
    obj = cache_users[ "user_red" ]
  File "C:\Python27\lib\shelve.py", line 122, in __getitem__
    value = Unpickler(f).load()
AttributeError: 'module' object has no attribute 'User'

person akaGrim    schedule 09.10.2011    source источник
comment
Можете ли вы показать полную трассировку?   -  person Thomas K    schedule 09.10.2011
comment
Отредактировал мой пост, чтобы добавить полную трассировку.   -  person akaGrim    schedule 09.10.2011


Ответы (2)


Исправить:

import SE_ex2
from SE_ex2 import User

SE_ex2.cacheTest()

Маринованный класс должен находиться в пространстве имен

Причина в том, что полка использует рассол, поэтому она использует класс пользователя:

При работе с вашими собственными классами вы должны убедиться, что анализируемый класс присутствует в пространстве имен процесса, читающего рассола. Выбираются только данные для экземпляра, а не определение класса. Имя класса используется для поиска конструктора для создания нового объекта при распаковке. Возьмем этот пример, который записывает экземпляры класса в файл:

цитируется: http://www.doughellmann.com/PyMOTW/pickle/index.html#problems-reconstructing-objects

person ninMonkey    schedule 09.10.2011

У меня уже были подобные проблемы с pickle раньше. Попробуйте поместить класс User в другой файл, чтобы вы импортировали его из одного и того же модуля в оба этих файла. Я думаю, что он помещается на полку как User, но когда вы снимаете его с полки, вы ожидаете, что он выяснит, что SE_ex2.User — это то, что он называл пользователем. Он также работает для явного импорта класса User, как в

from SE_ex2 import User
import SE_ex2
SE_ex2.cache_test()
person Thomas    schedule 09.10.2011