質問
私は私がシェルフにクロールいくつかのサイトを置くしようとしているが、棚には、任意のサイトのオブジェクトを受け付けません。それはあなたが持っているもののリスト、文字列、タプルを、受け入れますが、私はシェルフ
の内容を取得しようとするとすぐに、私はサイトオブジェクトに入れて、それがクラッシュしますだから私は、このように私の棚を埋めるときます:
def add_to_shelve(self, site):
db = shelve.open("database")
print site, site.url
for word in site.content:
db[word] = site.url #site.url is a string, word has to be one too
shelve.open("database")['whatever']
完璧に動作します。
しかし、私はこれを行う場合:
def add_to_shelve(self, site):
db = shelve.open("database")
print site, site.url
for word in site.content:
db[word] = site #site is now an object of Site
このエラーメッセージを出しshelve.open("database")['whatever']
エラーます:
AttributeError: 'module' object has no attribute 'Site'
私は完全に困惑し、PYTHONDOCSよ、妙に、いずれかの多くの情報を持っていません。彼らが言うすべては棚上げで、キーが文字列でなければならないことであるが、値またはデータがあることができ、「任意のオブジェクト」
解決
に見えます。棚からオブジェクトを取得する場合、Pythonは、オブジェクトを再構築し、そしてそれは、おそらく、あなたが移動した元のクラスを見つける必要があります。 (pickle
モジュールが行うように)shelve
で作業するとき、この問題が典型的である。
pickle
がそれを見つけることができるように、は、溶液は、それがために使用されるのと同じ場所にあるクラスの下位互換性基準を提供することです。あなたが再保存すると、すべてのオブジェクト、それによって、漬物を再構築するには、その後方comatibilityのrefereceを削除することができます。
他のヒント
Pythonは、「サイト」オブジェクトのコンストラクタを探し、それを見つけていないようです。私は棚を使用していないが、私はビザンチンある漬けすることができます何のためのルールを思い出して、棚のルールが類似している疑います。
の行を追加してみてください
サイト= sitemodule.Site
(「サイト」を提供するモジュールの名前で)あなたはアンシェルブしてみてください前に。このサイトのクラスを見つけることができることを保証します。