2013-01-02 2 views
1

나는 카드 덱을 만드는 것을 망설입니다. 나는 eval (repr (object))이 객체 stack overflow topic과 동등해야한다는 것을 읽은 문제가있다.Python eval (repr (object)) - 구문이 잘못되었습니다.

내 카드, Card 클래스 및 Deck 클래스에 대해 두 가지 클래스를 구현했습니다. 각각은 실제로 객체를 생성하는 구문에 가깝게 유지하려고하는 repr 메소드를 가지고 있습니다. 초기화 및 카드에 repr 및 갑판에 대한 코드 :

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 

나는 단순히 때문에 카드 클래스가 표시되는 방법입니다 추측하고있다 : 여기

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__) 

와는 오류입니다. {! r}을 {! s}로 대체하려고 시도했지만 변경되지 않았습니다. 나는 거기에 클래스 카드의 사실을 코딩 단지 열심히 고려하고 있었지만, 나는 그것을 할 의도가 어떤 구체적인 방법이있을 것이라고 기대했다.

는 해결하려면 그냥 self.__class__.__name__를 추가하고 사용하는 데 필요한 을 {!의} (그래서 따옴표를 제거하기) 즉

답변

3

당신이 볼 수 있듯이, 당신의 repr가에 있지 오히려 {r은!} 개체를 만드는 데 사용 된 모든 양식. 이 아니라 <class 'cards.Card'>(1,'hearts')입니다. 이 문제를 해결하는 한 가지 방법은 self.__class__ 대신 __repr__self.__class__.__name__을 사용하는 것입니다.

그러나 왜이 작업을 수행하고 있습니까? 당신은 방금 eval(repr(...))을 사용하여 대리인이 좋은지 테스트하고 있습니까? eval(repr(...))을 사용하는 것보다 인스턴스 복제본을 만드는 더 좋은 방법이 있습니다.

+1

예, 단위 테스트에 repr 테스트와 마찬가지로 포함시키려는 의도였습니다. 더 적절한 방법이 있습니까? 감사합니다. :) – Healsgood

+0

'copy (self) : return eval (repr (self))'는 인스턴스의 복제본을 만드는 방법을 구현하는 좋은 방법입니다. 그게 뭐가 잘못 되었습니까? 아니면 "더 좋은 방법"이 무엇입니까? –

2

클래스 자체를 repr하지 말고 이름을 사용하십시오.

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

그러면 소스 코드에서와 비슷하게 보입니다.

관련 문제