我搞砸了建立一副扑克牌。我有一个问题,我已阅读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/