为什么连接在这两个样本中的工作方式不同?

时间:2009-02-09 22:25:28

标签: python concatenation

我在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.

但是,第二个输出了一些奇怪的set和string混合:

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

为什么“+”运算符在这两种情况下表现不同?

编辑:对init的调用如下所示:

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

5 个答案:

答案 0 :(得分:8)

嗯,我错过了什么,或者你在比较

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

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

???

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

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

答案 1 :(得分: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.')

答案 2 :(得分:4)

使用单个参数(您的连接(或添加)字符串:

)实例化ValueError异常
raise ValueError(holeCards + ' does not represent a valid hand.')

这实现了带有2个参数的ValueError异常,无论卡是什么,还是字符串:

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

答案 3 :(得分: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 ...

答案 4 :(得分:0)

您是否在代码中的某处重载__add__(),这可能导致它返回元组或其他内容?