【问题标题】:Why does concatenation work differently in these two samples?为什么连接在这两个样本中的工作方式不同?
【发布时间】:2010-10-06 12:44:46
【问题描述】:

我在 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])

【问题讨论】:

  • 我正在努力了解第二个错误是如何出现的。我无法重现它。你确定它来自第二个代码块吗?您能否也发布捕获异常的代码?
  • len('Kr') == 2 不会通过测试。
  • 由于一个 ValueError 示例是连接(“+”)而另一个 ValueError 不是连接(它使用“,”),所以问题标题完全错误。请修复它。
  • S.Lott 的评论间接回答了我的问题。在我使用它的上下文中, raise ValueError(card, 'is not a known card.') 中的逗号不是作为连接符运行的,就像它在 print(card, 'is not a known卡。')这是我的错误。
  • (续)如果您愿意将您的评论转化为答案,我很乐意支持它。

标签: python concatenation


【解决方案1】:

嗯,是我遗漏了什么还是你在比较输出的结果

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

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

???

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

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

【讨论】:

  • 是的,在原始代码 sn-p 中,他在两种情况下都使用了“+”。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    在第二种情况下,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...

    【讨论】:

    • 我正在使用 Python 3.0 for Windows with IDLE。
    • (而且,我应该补充一点,'ERROR:' 是我在前面连接的东西,而不是引发异常的结果。
    • 您没有在其中一种情况下使用串联 :)
    【解决方案4】:

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

    【讨论】:

    • 因为可以动态修改“+”运算符的行为。
    • 我理解这个问题,但我没有触及 add 的定义。
    【解决方案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.')
    

    【讨论】:

    • 我以为它是一个字符串,当我输出 type(card) 时,我得到
    猜你喜欢
    • 1970-01-01
    • 2015-10-27
    • 2022-01-26
    • 2019-11-08
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    相关资源
    最近更新 更多