0

我在 Python 代码的两个不同位置引发异常:

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

AND (已编辑以更正提升代码)

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])
4

5 回答 5

8

嗯,我错过了什么还是你在比较输出

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

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

???

第二个使用“+”,但第一个使用“,”,它确实并且应该给出您显示的输出!

(nb。在这两种情况下,问题都是从带有“+”的版本编辑的。也许应该删除这个问题???)

于 2009-02-09T23:04:49.543 回答
5

“card”可能表示包含字符串“Kr”的元组。当您在元组上使用 + 运算符时,您会创建一个添加了额外项的新元组。

编辑:不,我错了。将字符串添加到元组:

>> ("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.')
于 2009-02-09T22:30:12.810 回答
4

这使用单个参数实例化 ValueError 异常,您的连接(或添加)字符串:

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

这使用 2 个参数实例化 ValueError 异常,无论卡片是什么和一个字符串:

raise ValueError(card, 'is not a known card.')
于 2009-02-09T23:05:09.870 回答
1

在第二种情况下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 版本/实现?我在 Linux 上的 cpython 解释器将 ValueErrors 报告为ValueError,而不是ERROR...

于 2009-02-09T22:53:50.833 回答
0

您是否重载了__add__()代码中的某个地方,这可能导致它返回一个元组或其他东西?

于 2009-02-09T22:42:46.133 回答