我搞砸了建立一副扑克牌。我有一个问题,我已阅读eval(repr(object))应该等效于对象stack overflow topic

我为卡实现了两个类,一个Card类和一个Deck类。每个对象都有一个repr方法,在该方法中,我尝试使语法与实际创建对象的语法尽可能接近。 Card and Deck的初始化和复制代码:

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},但并没有改变。我当时只是考虑硬编码其中存在Card类的事实,但是我希望会有某种特定的方式来实现它。

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

最佳答案

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

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

关于python - Python eval(repr(object))-无效的语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14116064/

10-12 19:27