Python eval(repr(object)) - 语法无效

时间:2013-01-02 01:53:22

标签: python class repr

我正忙着建造一副纸牌。我有一个问题,我已经读过eval(repr(object))应该等同于对象stack overflow topic

我为我的卡实现了两个类,一个Card类和一个Deck类。每个都有一个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类的表示方式。我试图用{!r}代替{!s},但它没有改变它。我正在考虑硬编码这个类卡的事实,但是我希望有一些特定的方式来实现它。

要解决: 只需在.__name__之后添加self.__class__并使用{!s}(以便删除引号)而不是{!r}

2 个答案:

答案 0 :(得分:3)

如您所见,您的repr根本不是用于创建对象的表单。它是<class 'cards.Card'>(1,'hearts'),而不是Card(1, 'hearts')。解决此问题的一种方法是在self.__class__.__name__而不是__repr__中使用self.__class__

但是,你为什么要这样做?您是否只是使用eval(repr(...))来测试repr是否正常?与使用eval(repr(...))相比,有更好的方法来创建实例的副本。

答案 1 :(得分:2)

不要重新编写类本身,请使用其名称。

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

它应该看起来像源代码中的样子。