0

Pythonコードの2つの異なる場所で例外を発生させています。

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.

しかし、2番目はセットと文字列の奇妙なハイブリッドを出力します:

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

これらの2つのケースで、「+」演算子の動作が異なるのはなぜですか。

編集: 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.')

???

2 番目は「+」を使用しますが、最初は「,」を使用します。これにより、表示される出力が得られます。

(注。どちらの場合も、質問は「+」を含むバージョンから編集されました。おそらく、この質問は削除する必要があります???)

于 2009-02-09T23:04:49.543 に答える
5

「カード」はおそらく文字列「Kr」を含むタプルを表します。タプルで + 演算子を使用すると、余分な項目が追加された新しいタプルが作成されます。

編集:いいえ、私は間違っています。タプルに文字列を追加する:

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

エラーが発生します:

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

「カード」のタイプを判別することは、おそらく役立つでしょう。何型か分かりますか?そうでない場合は、次のような print ステートメントを挿入してみてください。

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

2 番目のケース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 に答える