私は次のように書いています、そこでは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
を使用してテストを実行しています。
使用する e.args
、e.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。
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ステートメントのコードを出力しません。エラーメッセージで失敗した式のソースコードを含める必要はないことに注意してください。スタックトレースの一部として表示されます。
この方法で、メッセージを編集し、スタックトレース(およびその他の情報)を表示することができました。改行も正しく表示されます。
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
キャッチした例外を取得し、それを文字列に変換し、追加の文字列情報と組み合わせて、新しい例外を発生させます。
x = 3
y = 5
try:
assert( x == y )
except AssertionError, e:
raise( AssertionError( "Additional info. %s"%e ) )
例外を作成するときに、目的のメッセージを渡すことができます。
raise AssertionError(line1 + ' != ' + line2)
お役に立てれば。