67

私は次のように書いています。Unicodeテキストの2つの複数行ブロックを比較するときに、まともなエラーメッセージを生成しようとしています。比較を行う内点法はアサーションを発生させますが、デフォルトの説明は私には役に立ちません

以下のようなコードに何かを追加する必要があります。

def assert_long_strings_equal(one, other):
    lines_one = one.splitlines()
    lines_other = other.splitlines()
    for line1, line2 in zip(lines_one, lines_other):
        try:
            my_assert_equal(line1, line2)
        except AssertionError, error:
            # Add some information to the printed result of error??!
            raise

キャッチしたassertionerrorに出力されたエラーメッセージを変更する方法がわかりません。私は常にAssertionError: u'something' != 'something else'、出力の最初の行のみを表示するを取得します。

アサーションメッセージを変更して、必要なものをすべて印刷するにはどうすればよいですか?

nose関連する場合は、テストの実行に使用しています。

4

4 に答える 4

121
assert expression, info

例えば、

>>> assert False, "Oopsie"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: Oopsie

ドキュメントから:

アサーションステートメントは、デバッグアサーションをプログラムに挿入するための便利な方法です。

assert_stmt ::=  "assert" expression
["," expression] 

単純な形式、、 assert expressionはと同等です

if __debug__:
    if not expression:
        raise AssertionError 

拡張フォーム

assert expression1, expression2

と同等です

if __debug__:
    if not expression1:
        raise AssertionError(expression2)

これらの同等性は、それらの名前の組み込み変数を想定し __debug__、参照します。AssertionError現在の実装では、組み込み変数__debug__は通常の状況ではTrueであり、最適化が要求された場合はFalseです(コマンドラインオプション-O)。現在のコードジェネレーターは、コンパイル時に最適化が要求されたときに、assertステートメントのコードを出力しません。エラーメッセージで失敗した式のソースコードを含める必要がないことに注意してください。スタックトレースの一部として表示されます。

于 2010-09-27T21:34:10.353 に答える
68

の使用e.argse.message非推奨です。

try:
    assert False, "Hello!"
except AssertionError as e:
    e.args += ('some other', 'important', 'information', 42)
    raise

これにより、元のトレースバックが保持されます。その最後の部分は次のようになります。

AssertionError: ('Hello!', 'some other', 'important', 'information', 42)

Python2.7とPython3の両方で動作します。

于 2013-02-27T11:54:49.520 に答える
5

キャッチされた例外を取得して文字列に変換し、追加の文字列情報と組み合わせて、新しい例外を発生させます。

x = 3
y = 5
try:
    assert( x == y )
except AssertionError, e:
    raise( AssertionError( "Additional info. %s"%e ) )
于 2010-09-27T22:46:20.137 に答える
4

例外を作成するときに、目的のメッセージを渡すことができます。

raise AssertionError(line1 + ' != ' + line2)

お役に立てれば。

于 2010-09-27T20:52:34.320 に答える