0

ノードを使用してグラフを作成し、エッジを追跡するコードがあります。このコード自体は正常に動作しているように見えますが、reprオーバーライドを期待どおりに動作させることができません。いくつかのstr vs reporepr () が非文字列スレッドを返したのを読んだ後、私の悩みの原因を突き止めます。

!/usr/bin/python
class Edge:
    def __init__(self, here, there, txt):
        self.description = txt     # why am i making this jump?
        self.here = here    # where do i start
        self.there = there   # where to i end
        self.here.out += [self]  # btw, tell here that they can go there

    def __repr__(self):
        return "E(" + self.here.name + " > " + self.there.name + ")"


class Node:
    end = "."
    start = "!"

    def __init__(self, g, nid, name, stop=False, start=False):
        self.nid = nid
        self.graph = g  # where do i live?
        self.name = name  # what is my name?
        self.description = ""  # tell me about myself
        self.stop = stop  # am i a stop node?
        self.start = start  # am i a start node?
        self.out = []  # where do i connect to

    def also(self, txt):
        """adds text to description"""
        sep = "\n" if self.description else ""
        self.description += sep + txt

    def __repr__(self):
        y = "N( :id " + self.nid + \
            "\n   :name " + self.name + \
            "\n   :about '" + self.description + "'" + \
            "\n   :out   " + ",".join(str(n) for n in self.out) + " )"


class Graph:
    def __init__(self):
        self.nodes = []  # nodes, stored in creation order
        self.keys = {}  # nodes indexed by name
        self.m = None  # adjacency matrix
        self.mPrime = None  # transitive closure matrix

    def __repr__(self):
        return "\n".join(str(u) for u in self.nodes)

    def node(self, name):
        """returns a old node from cache or a new node"""
        if not name in self.keys:
            self.keys[name] = self.newNode(name)
        return self.keys[name]

    def newNode(self, name):
        """ create a new node"""
        nid = len(self.nodes)
        tmp = Node(self, nid, name)
        tmp.start = Node.start in name
        tmp.end = Node.end in name
        self.nodes += [tmp]
        return tmp

その関数が文字列ハンドラーによって呼び出されるたびに、 reprが文字列を返すことは私の理解です。より具体的には、インスタンスを文字列として参照し、 strを探し、strがreprを指し、呼び出し元のメソッドに文字列として返されます。私のプログラムでは、問題なく作成されたグラフがありますが、印刷すると、結合するリストを連結してスタックし、文字列ではなくintとして返しますか?

適切に機能するために文字列を明示的にキャストする必要があったため、reprが呼び出されていない可能性があると考えて、さまざまな部分を文字列としてキャストしようとしました。私の話の短所は、私のreprが "\n".join() によって適切に処理されておらず、何らかの形で から int 値を取得して",".join(str(n) for n in self.out)おり、str と int を連結できないことを示しています。

私は本当に途方に暮れています.reprの使用に関する多くのGoogleの回答とテキスト、およびここでの多くの回答を読みましたが、ここで見落としているものを正確に理解していません.

グラフ自体は次のように作成されます。最初の行はノード名で、exit は > で始まり、その間のすべてがノードの場所の説明です。

グラフは私が編集することになっているものprint graph("mystageText.txt")あり、. したがって、インスタンスのリストを使用したreprの明確で簡潔な例が利用できないように見えるため、私はこの問題についてかなり混乱しています。repr(graph("myStageText.txt")

助けてくれてありがとう、うまくいけば、これはStackOverflowにとって十分に簡潔です。私の問題について徹底的に説明しようとしたときに、少し言葉が多すぎた場合は申し訳ありません。

4

1 に答える 1

0

あなたの問題は本当にそこから来ているようです

        y = "N( :id " + self.nid + \
        #                   ^

self.nidは整数です。

別のバグ:Node.__repr__何も返さない。

于 2014-02-23T11:20:43.250 に答える