さて、これは未解決の質問であり、私が触れておきたい2つの側面があります。アサーションを追加するタイミングとエラーメッセージを書き込む方法です。
目的
初心者に説明するには-アサーションはエラーを発生させる可能性があるステートメントですが、キャッチすることはできません。そして、彼らは通常、育てられるべきではありませんが、実際には、とにかく育てられることがあります。そして、これはコードが回復できない深刻な状況であり、「致命的エラー」と呼ばれています。
次に、それは「デバッグ目的」のためのものであり、正しいのですが、非常に否定的です。初心者によって動作が異なりますが、「違反しないでください」という変則を宣言する定式化が好きです...「理解するだけ」もあれば、用途が見つからないものや、通常の例外を置き換えるものもあります。またはそれでフローを制御します。
スタイル
Pythonでは、assert
はステートメントではなく、関数です!(assert(False, 'is true')
レイズしないことを忘れないでください。しかし、それを邪魔にならないようにしてください:
いつ、どのように、オプションの「エラーメッセージ」を書き込むのですか?
これはacuallyしばしば(アサーションを行うには、多くの専用のメソッドを持っているユニットテストフレームワークに適用されるassertTrue(condition)
、assertFalse(condition), assertEqual(actual, expected)
など)。また、アサーションについてコメントする方法も提供します。
使い捨てコードでは、エラーメッセージなしで実行できます。
場合によっては、アサーションに追加するものはありません。
def dump(something):assert isinstance(something、Dumpable)#...
しかし、それとは別に、メッセージは他のプログラマー(Ipython / Jupyterなどのコードのインタラクティブなユーザーである場合があります)との通信に役立ちます。
内部実装の詳細を漏らすだけでなく、情報を提供します。
の代わりに:
assert meaningless_identifier <= MAGIC_NUMBER_XXX, 'meaningless_identifier is greater than MAGIC_NUMBER_XXX!!!'
書く:
assert meaningless_identifier > MAGIC_NUMBER_XXX, 'reactor temperature above critical threshold'
または多分:
assert meaningless_identifier > MAGIC_NUMBER_XXX, f'reactor temperature({meaningless_identifier }) above critical threshold ({MAGIC_NUMBER_XXX})'
私は知っています。これは静的なアサーションの場合ではありませんが、メッセージの情報としての価値を指摘したいと思います。
否定的または肯定的なメッセージ?
これは議論の余地があるかもしれませんが、私は次のようなものを読むのを傷つけます:
assert a == b, 'a is not equal to b'
次に、getting AssertionError: a must be equal to b
も読み取り可能で、ステートメントはコード内で論理的に見えます。また、トレースバックを読み込まなくても、何かを取得できます(トレースバックを利用できない場合もあります)。