代码之家  ›  专栏  ›  技术社区  ›  Yes - that Jake.

为什么这两个示例中的连接工作方式不同?

  •  1
  • Yes - that Jake.  · 技术社区  · 17 年前

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

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

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

    编辑: 对init的调用如下:

      card1 = PokerCard(cardsStr[0:2])
      card2 = PokerCard(cardsStr[2:4])
    
    5 回复  |  直到 17 年前
        1
  •  8
  •   Andrew Jaffe    17 年前

    嗯,我是遗漏了什么,还是你在比较

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

    具有

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

    ???

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

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

        2
  •  5
  •   James Orr    17 年前

    “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.')
    
        3
  •  4
  •   mluebke    17 年前

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

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

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

    raise ValueError(card, 'is not a known card.')
    
        4
  •  1
  •   Jaime Soriano    17 年前

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

        5
  •  0
  •   codelogic    17 年前

    你超载了吗 __add__() 在代码的某个地方,这可能会导致它返回一个元组或其他什么?