2

私はトランプのデッキを構築するのをいじっています。eval(repr(object)) はオブジェクトスタック オーバーフロー トピックと同等である必要があることを読んだところに問題があります。

カード用に Card クラスと Deck クラスの 2 つのクラスを実装しました。それぞれに repr メソッドがあり、実際にオブジェクトを作成する構文にできるだけ近づけようとしました。カードとデッキの init と repr のコード:

class Card(object):

    def __init__(self, num, suit):
        self.__num = num
        self.__suit = suit

    def __repr__(self):
        return "{!r}({!r},{!r})".format(self.__class__, self.__num, self.__suit)

class Deck(object):

    def __init__(self, cards=None):
        if not cards:
            self.__cards = {"diamonds":[], "hearts":[], "spades":[], "clubs":[]}
        else:
            self.__cards = cards

    def __repr__(self):
         return "{!r}({!r})".format(self.__class__, self.__dict__)

ここにエラーがあります:

print(eval(repr(self.deck.deck)))
File "<string>", line 1
{'hearts': [<class 'cards.Card'>(1,'hearts'), <class 'cards.Card'>(2,'hearts'), <class 'cards.Card'>(3,'hearts'), <class 'cards.Card'>(4,'hearts'), <class 'cards.Card'>(5,'hearts')], 'clubs': [<class 'cards.Card'>(1,'clubs'), <class 'cards.Card'>(2,'clubs'), <class 'cards.Card'>(3,'clubs'), <class 'cards.Card'>(4,'clubs'), <class 'cards.Card'>(5,'clubs')], 'spades': [<class 'cards.Card'>(1,'spades'), <class 'cards.Card'>(2,'spades'), <class 'cards.Card'>(3,'spades'), <class 'cards.Card'>(4,'spades'), <class 'cards.Card'>(5,'spades')], 'diamonds': [<class 'cards.Card'>(1,'diamonds'), <class 'cards.Card'>(2,'diamonds'), <class 'cards.Card'>(3,'diamonds'), <class 'cards.Card'>(4,'diamonds'), <class 'cards.Card'>(5,'diamonds')]}
            ^
SyntaxError: invalid syntax

Card クラスの表現方法が原因だと単純に推測しています。{!s} を {!r} に置き換えてみましたが、変更されませんでした。私はそれがカードクラスであるという事実をハードコーディングすることを考えていましたが、それを行うための特定の方法があることを望んでいました.

解決するには: {!r} ではなく {!s} (引用符を削除するため) の.__name__後に追加して使用する必要がありましたself.__class__

4

2 に答える 2

4

ご覧のとおりrepr、オブジェクトの作成に使用されたフォームとはまったく異なります。では<class 'cards.Card'>(1,'hearts')ありませんCard(1, 'hearts')。これを修正する 1 つの方法は、 の代わりにself.__class__.__name__in yourを使用することです。__repr__self.__class__

しかし、なぜあなたはこれをしているのですか?eval(repr(...))repr が適切であることをテストするために使用しているだけですか? を使用するよりも、インスタンスの複製を作成するためのより良い方法がありますeval(repr(...))

于 2013-01-02T02:07:32.213 に答える
2

クラス自体を再現しないでください。その名前を使用してください。

def __repr__(self):
    return "{}({!r},{!r})".format(self.__class__.__name__, self.__num, self.__suit)

その後、ソース コードでの表示と同じように表示されます。

于 2013-01-02T02:07:49.270 に答える