2009-02-09 4 views
0

Je soulève des exceptions dans deux endroits différents dans mon code Python:Pourquoi la concaténation fonctionne-t-elle différemment dans ces deux échantillons?

holeCards = input("Select a hand to play: ") 
try: 
    if len(holeCards) != 4: 
     raise ValueError(holeCards + ' does not represent a valid hand.') 

ET (sous la direction de corriger le code augmentation)

def __init__(self, card): 
    [...] 

    if self.cardFace == -1 or self.cardSuit == -1: 
    raise ValueError(card, 'is not a known card.') 

Pour une raison quelconque, les premières sorties d'une chaîne concaténée comme Je m'attendais:

ERROR: Amsterdam does not represent a valid hand. 

Mais, le second produit un étrange hybride d'ensemble et de s tring:

ERROR: ('Kr', 'is not a known card.') 

Pourquoi l'opérateur "+" se comporte-t-il différemment dans ces deux cas?

Edit: L'appel à init ressemble à ceci:

card1 = PokerCard(cardsStr[0:2]) 
    card2 = PokerCard(cardsStr[2:4]) 
+0

Montrez-nous votre appel à init. – paxdiablo

+0

J'ai du mal à voir comment la deuxième erreur pourrait survenir. Je ne peux pas le reproduire. Es-tu sûr que ça vient du deuxième bloc de code? Pourriez-vous également poster le code qui intercepte les exceptions? –

+0

len ('Kr') == 2 n'échouerait pas le test. – codelogic

Répondre

5

"carte" représente probablement un tuple contenant la chaîne "Kr." Lorsque vous utilisez l'opérateur + sur un tuple, vous créez un nouveau tuple avec l'élément supplémentaire ajouté.

edit: non, je me trompe. Ajout d'une chaîne à un tuple:

>> ("Kr",) + "foo" 

génère une erreur:

TypeError: can only concatenate tuple (not "str") to tuple 

Il serait probablement utile de déterminer le type de "carte". Savez-vous de quel type il s'agit? Sinon, essayez de mettre dans une déclaration d'impression comme:

if len(card) != 2: 
    print type(card) 
    raise ValueError(card + ' is not a known card.') 
+0

Je pensais que c'était une chaîne et, quand je produis le type (carte), je reçois

0

Avez-vous surchargé le quelque part __add__() dans le code, qui pourrait être à l'origine pour retourner un tuple ou quelque chose?

+0

Non. Je ne comprends pas pourquoi la question est pertinente non plus. –

+0

Parce qu'il est possible de modifier dynamiquement le comportement de l'opérateur '+'. – codelogic

+0

Je comprends la question, mais je ne touche pas à la définition de __add__. –

1

Dans le second cas, card n'est pas une chaîne à coup sûr. Si c'était une chaîne alors len('2') serait égal à 2 et l'exception ne serait pas augmentée, alors vérifiez d'abord ce que vous essayez de concaténer, il semble que quelque chose ajouté à une chaîne renvoie quelque chose représenté comme un tuple.

Je vous recommande d'utiliser la mise en forme de chaîne au lieu de la concaténation de chaîne pour créer le message d'erreur. Il utilisera la représentation sous forme de chaîne (__repr__) de l'objet.

Avec la mise en forme de chaîne:

>>> "%s foo" % (2) 
'2 foo' 

Avec la concaténation de chaîne:

>>> 2 + " foo" 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
TypeError: unsupported operand type(s) for +: 'int' and 'str' 

Et autre question ... quelle version python/mise en œuvre utilisez-vous? Mon interpréteur cpython sous Linux signale ValueErrors comme ValueError, pas ERROR ...

+0

Oups. Mauvais relanceur. J'ai corrigé dans la question originale. –

+0

J'utilise Python 3.0 pour Windows avec IDLE. –

+0

(Et, j'aurais dû ajouter que le 'ERREUR:' est quelque chose que je concatenated sur le front, pas le résultat de l'exception élevée –

8

Um, suis-je manque quelque chose ou comparez-vous la sortie de

raise ValueError(card, 'is not a known card.') 

avec

raise ValueError(card + ' is not a known card.') 

???

La seconde utilise "+", mais la première utilise ",", qui donne et devrait donner la sortie que vous montrez!

(nb. A été édité la question à partir d'une version avec "+" dans les deux cas. Peut-être que cette question devrait être supprimée ???)

+0

Yup, dans le code original extrait, il utilisait '+' dans les deux cas. – codelogic

4

Cette instancie l'exception ValueError avec un seul argument, votre concated (ou ajoutée) chaîne:

raise ValueError(holeCards + ' does not represent a valid hand.') 

Ce instancie l'exception ValueError avec 2 arguments, quelle que soit la carte est et une chaîne:

raise ValueError(card, 'is not a known card.') 
Questions connexes