2012-04-07 25 views
1

"picklesで始まる"スクリプトを作成しようとしています。私はファイルからpickleファイルを保存して読み込みました。しかし、pickleファイルを1つのファイル(この場合はmain.py)に保存して別のファイルからロードすると、エラーが発生します。私はおそらく何か小さいものを見逃していたが、何が分からないのか。pickleファイルを読み込む

main.py

import pickle 

class Node: 
    """This class represents a node""" 

    def __init__(self, value = None): 
    self.val = value 

    def toString(self): 
    return self.val 


class Link: 
    """This class represents a link between 2 nodes""" 

    def __init__(self, sourceNode, targetNode, LinkWigth): 
    self.source = sourceNode 
    self.target = targetNode 
    self.wight = LinkWigth 

    def setWeight(self, newWeight): 
    self.wight = newWeight 

    def toString(self): 
    return self.wight 

class Graph: 
    """This class represents a graph""" 

    def __init__(self): 
    self.nodes = [] 
    self.links = [] 

    def addNode(self, node): 
    self.nodes.append(node) 

    def addLink(self, link): 
    self.links.append(link) 

    def getInDegree(self, node): 
    counter = 0 
    for link in self.links: 
     if link.target == node: 
     counter +=1 
     else: 
     print "target is: %s" % link.target.toString() 
     print "source is: %s" % link.source.toString() 
    return counter 

    def toString(self): 
    for link in self.links: 
     print link.toString() 
    for node in self.nodes: 
     print node.toString() 


if __name__ == "__main__": 
    n1 = Node(4) 
    l1 = Link(n1, n1, 1) 
    g = Graph() 
    g.addNode(n1) 
    g.addLink(l1) 
    pickle.dump(g, open('haha', 'wb')) 

pickleLoader.py

import pickle 
import main 


n = main.Node(44) 
print n.toString() 
g = pickle.load(open('haha', 'rb')) 
print "ha" 

エラー

C:\Users\R\Desktop\pickle test>main.py 

C:\Users\R\Desktop\pickle test>pickleLoader.py 
44 
Traceback (most recent call last): 
    File "C:\Users\R\Desktop\pickle test\pickleLoader.py", line 7, in <module> 

    g = pickle.load(open('haha', 'rb')) 
    File "C:\Program Files\Python27\lib\pickle.py", line 1378, in load 
    return Unpickler(file).load() 
    File "C:\Program Files\Python27\lib\pickle.py", line 858, in load 
    dispatch[key](self) 
    File "C:\Program Files\Python27\lib\pickle.py", line 1069, in load_inst 
    klass = self.find_class(module, name) 
    File "C:\Program Files\Python27\lib\pickle.py", line 1126, in find_class 
    klass = getattr(mod, name) 
AttributeError: 'module' object has no attribute 'Graph' 

C:\Users\R\Desktop\pickle test> 

私はmain.pyがインポートされているため、問題は、名前空間で何かあると思いますが、私はそれを働かせる方法がない。

答えて

0

これはモジュールとの関係でクラスがどのように定義されているかに関係しているようです。仕事にこれを許可する簡単な方法は、直接pickleLoadermainモジュールのコンポーネントをインポートすることです:

from main import Graph, Node, Link 

より良い解決策は、独自のモジュールに共通のコンポーネント(グラフ、ノード、リンク)を移動するかもしれません、そのモジュールをmainpickleLoaderの両方にインポートします。

+0

ありがとうございます。しかし、なぜこれらの3つのコンポーネントを別のモジュールに移動する方が良いでしょうか?それは何が変わるでしょうか? –

+1

これらを別のモジュールに配置し(そしてそのモジュールをインポートすること)、名前空間の衝突を避けるのに役立ちます。現在のアプローチでは、型を現在の名前空間に持ち込む必要があります。それらを別のモジュールに配置してインポートすると、それらを自分の名前空間に保持します。 – DRH