Почему конкатенация работает по-разному в этих двух примерах? - PullRequest
0 голосов
/ 10 февраля 2009

Я поднимаю исключения в двух разных местах в моем коде Python:

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

И (отредактировано для исправления кода повышения)

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

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

По какой-то причине первый выводит каскадную строку, как я и ожидал:

ERROR: Amsterdam does not represent a valid hand.

Но второй выводит какой-то странный гибрид множества и строки:

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

Почему оператор "+" ведет себя по-разному в этих двух случаях?

Редактировать: Вызов init выглядит так:

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

Ответы [ 5 ]

8 голосов
/ 10 февраля 2009

Хм, я что-то упустил или вы сравниваете вывод

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

с

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

???

Второй использует «+», но первый использует «,», что дает и должно давать вывод, который вы показываете!

(примечание. Вопрос был отредактирован из версии с "+" в обоих случаях. Возможно, этот вопрос следует удалить ???)

5 голосов
/ 10 февраля 2009

«карточка», вероятно, представляет собой кортеж со строкой «Кр». Когда вы используете оператор + для кортежа, вы создаете новый кортеж с добавленным дополнительным элементом.

изменить: нет, я ошибаюсь. Добавление строки в кортеж:

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

генерирует ошибку:

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

Вероятно, было бы полезно определить тип "карты". Вы знаете, что это за тип? Если нет, попробуйте ввести заявление для печати, например:

if len(card) != 2:
    print type(card)
    raise ValueError(card + ' is not a known card.')
4 голосов
/ 10 февраля 2009

Это создает исключение ValueError с одним аргументом, вашей конкатенированной (или добавленной) строкой:

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

Это создает исключение ValueError с 2 аргументами, независимо от того, какая карта используется, и строкой:

raise ValueError(card, 'is not a known card.')
1 голос
/ 10 февраля 2009

Во втором случае card точно не строка. Если бы это была строка, то len('2') было бы равно 2, и исключение не возникало бы, поэтому сначала проверьте, что вы пытаетесь объединить, кажется, что то, что добавлено в строку, возвращает что-то, представленное в виде кортежа.

Я рекомендую вам использовать форматирование строк вместо конкатенации строк для создания сообщения об ошибке. Он будет использовать строковое представление (__repr__) объекта.

С форматированием строки:

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

С конкатенацией строк:

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

И еще вопрос ... какую версию / реализацию python вы используете? Мой интерпретатор cpython в Linux сообщает о ValueErrors как ValueError, а не ERROR ...

0 голосов
/ 10 февраля 2009

Вы перегрузили __add__() где-нибудь в коде, что может привести к его возвращению кортежа или чего-то еще?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...