web-dev-qa-db-ja.com

Python AssertionErrorでメッセージを変更するには?

私は次のように書いています、そこでは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を使用してテストを実行しています。

44

使用する 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)

Python 2.7およびPython 3。

49
Honza Javorek
assert expression, info

例えば、

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

docs から:

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

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ステートメントのコードを出力しません。エラーメッセージで失敗した式のソースコードを含める必要はないことに注意してください。スタックトレースの一部として表示されます。

75
Katriel

この方法で、メッセージを編集し、スタックトレース(およびその他の情報)を表示することができました。改行も正しく表示されます。

try:
   my_assert_equal(line1, line2)
except AssertionError as e:
   message = e.args[0]
   message += "\nThis appends the default message and can have newlines"
   e.args = (message,) #wrap it up in new Tuple
   raise
4
Antti Väyrynen

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

x = 3
y = 5
try:
    assert( x == y )
except AssertionError, e:
    raise( AssertionError( "Additional info. %s"%e ) )
4

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

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

お役に立てれば。

3
zchtodd