1

shelve モジュールを試していますが、問題が発生しています。私の意図は、シェルブ内のファイルを変更する 1 つのモジュールが 2 番目のモジュールで関数を呼び出すようにすることです。棚に格納されているものに変数を設定し、そのオブジェクトを出力するだけのプロトタイプ (以下) を作成しました。

これを行おうとすると、次の属性エラーが発生します。

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'
4

2 に答える 2

2

修理:

import SE_ex2
from SE_ex2 import User

SE_ex2.cacheTest()

ピクルされたクラスは名前空間にある必要があります

その理由は、シェルフがピクルを使用しているため、 User クラスを使用するためです。

独自のクラスを操作する場合、pickle を読み取るプロセスの名前空間に pickle されるクラスが表示されるようにする必要があります。クラス定義ではなく、インスタンスのデータのみがピクルされます。クラス名は、unpickle 時に新しいオブジェクトを作成するためのコンストラクターを見つけるために使用されます。クラスのインスタンスをファイルに書き込むこの例を見てみましょう。

引用: http://www.doughellmann.com/PyMOTW/pickle/index.html#problems-reconstructing-objects

于 2011-10-09T20:06:07.290 に答える
0

私も以前、似たようなトラブルがありましたpickle。User クラスを別のファイルに配置して、これらの両方のファイルの同じモジュールからインポートするようにしてください。としてシェルフされていると思いますが、シェルフUserを解除すると、それが User と呼ばれていたものであることがわかると予想されSE_ex2.Userます。次のように、 User クラスを明示的にインポートすることもできます。

from SE_ex2 import User
import SE_ex2
SE_ex2.cache_test()
于 2011-10-09T19:06:13.703 に答える