我正忙着建造一副纸牌。我有一个问题,我已经读过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}
答案 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)
它应该看起来像源代码中的样子。