Pythonでの「アサート」の用途は何ですか?


回答:


1085

assert声明は、ほとんどすべてのプログラミング言語に存在します。これは、他の操作の副作用としてではなく、原因が明らかなプログラムの早い段階で問題を検出するのに役立ちます。

あなたがするとき...

assert condition

...その条件をテストし、条件が偽の場合はすぐにエラーをトリガーするようにプログラムに指示しています。

Pythonでは、これはおおよそこれと同等です。

if not condition:
    raise AssertionError()

Pythonシェルで試してください:

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

アサーションにはオプションのメッセージを含めることができ、インタープリターの実行時にそれらを無効にすることができます。

アサーションが失敗した場合にメッセージを出力するには:

assert False, "Oh no! This assertion failed!"

関数のように呼び出すために括弧を使用しないでくださいassert。言明です。その場合、最初のパラメーターとしてタプルを使用してをassert(condition, message)実行します。assert(condition, message)

それらを無効にすることに関しては、python最適化モードで実行されている場合、__debug__False、assertステートメントは無視されます。-Oフラグを渡すだけです:

python -O script.py

関連ドキュメントについては、こちらをご覧ください。


92
Nit:assertはステートメントであり、関数ではありません。そして、printは異なり、Python 3ではそれはまだステートメントです。
Bob Stein

2
@チェーンアサートは、「* something」がTrueであることを確認することを意味します。したがって、a == 3をアサートすると、aが3に等しいことが確認されます。aが3に等しくない場合(つまり、a == 3がFalseの場合)、エラーを発生させる
Ant

5
だけを使用できる場合if not condition: raise AssertError()、なぜアサートを使用する必要があるのですか?単に短い形式のif not conditionステートメントであること以外に、アサートが優れている条件はありますか?
alpha_989 2018年

6
@ alpha_989 a)短くて読みやすく、b)インタープリターを実行するときにassertステートメントを無効にできます(マニュアルではそうではありませんif)。詳細については、ドキュメントを参照してください:)
slezica

9
この回答がどのようにして多くの賛成票を獲得するのか、実際には他の回答も完全に得ることはできません。質問は「Pythonでの「アサート」の使用とは何ですか?」ということなので、「いつ使用するか、より正確には:の使用シナリオは何ですか」と尋ねられますが、assertすべての回答を読んだ後、私はまったく何も望みませんでした。
lnshi 2018

424

括弧に注意してください。上で指摘したように、Pythonの3で、assertまだ文ですので、類推して、print(..)一つはに同じを推定するassert(..)raise(..)が、あなたはいけません。

これは重要です。

assert(2 + 2 == 5, "Houston we've got a problem")

とは異なり、動作しません

assert 2 + 2 == 5, "Houston we've got a problem"

最初のものが機能しない理由は、にbool( (False, "Houston we've got a problem") )評価されるためTrueです。

ステートメントではassert(False)、これらはを囲む冗長な括弧Falseであり、その内容を評価します。ただしassert(False,)、括弧はタプルになり、空でないタプルTrueはブールコンテキストで評価されます。


18
私はここに、括弧に関する正確な情報とフォローメッセージを探して来ました。ありがとう。
superbeck

6
しかしassert (2 + 2 = 5), "Houston we've got a problem"、大丈夫でしょう、そうですか?
SherylHohman 2017

4
@SherylHohman自分で実行して、動作するかどうかを確認することもできます
DarkCygnus

2
PEP 8準拠の暗黙的な行の継続にかっこをよく使用することを忘れないでください。また、タプルはかっこではなく、コンマの存在によって定義されることも忘れないでください(タプルは、目的以外は括弧とは関係ありません)演算子の優先順位)。
カウベルト2017

4
assert (2 + 2 = 5), "Houston we've got a problem"動作しません...しかし、assertステートメントとは関係ありません。条件ではないため、条件は機能しません。秒がありません=
n1k31t4

133

他の回答で述べたassertように、特定の条件が真でない場合に例外をスローするのと同じです。重要な違いは、最適化オプションを使用してコードをコンパイルすると、assertステートメントが無視されることです-Oドキュメントには、それが言うassert expressionより良いと同等であると説明することができます

if __debug__:
   if not expression: raise AssertionError

これは、コードを徹底的にテストし、アサーションケースが失敗しないことに満足したときに最適化されたバージョンをリリースする場合に役立ちます。最適化がオンの場合、__debug__変数はFalseになり、条件は評価されなくなります。この機能は、アサーションに依存していて、アサートが消えたことに気づいていない場合にも注意を引くことができます。


これは、特定の変数または正しい入力(プログラムが記述されている規約に従って)がユーザーによって実行されたときにプログラムがクラッシュする可能性がある場合(ユーザーが-Oフラグを使用してプログラム)、代わりにif Not Error: raise Exception(“ this is a error”)?こうすることで、プログラムはまだ..ユーザーがそれを実行したとき、エラーの原因が表示されます
alpha_989

一方、コードの不正なロジック/実装が原因でプログラムがエラーになる可能性があると予想される場合(ただし、プログラムのユーザーとの契約に基づく入力によるものではない)、assertステートメントを使用する必要がありますか?ここでの前提は、プログラムがエンドユーザーにリリースされるときに-Oフラグを使用しているため、すべてのバグが削除されていることを前提としています。したがって、エラーまたはプログラムのクラッシュは、契約に従って有効であるプログラムへの入力が原因ですが、プログラムでは処理できません。したがって、ユーザーに警告する必要があります。
alpha_989

まさにその通りです。私はアサーションを、開発者としてあなたが本当だと思うことを、開発中に実際に本当であることを確認するのを助けるためだけのサニティチェックとして考えるのが好きです。
クリストファーシュロバ2018年

52

Pythonのアサーションの目的は、プログラムの回復不可能なエラーについて開発者に通知することです。

アサーションは、「ファイルが見つかりません」など、ユーザーが修正措置を講じることができる(または単に再試行する)可能性のあるエラー条件を通知することを目的としていません。

これを見る別の方法は、アサーションはコードの内部セルフチェックであると言うことです。これらは、コードで一部の条件を不可能として宣言することで機能します。これらの条件が満たされない場合は、プログラムにバグがあることを意味します。

プログラムにバグがない場合、これらの条件は発生しません。しかし、それらのいずれか発生した場合、プログラムは、どの「不可能」な状態がトリガーされたかを正確に伝えるアサーションエラーでクラッシュします。これにより、プログラム内のバグの追跡と修正がはるかに簡単になります。

以下は私が書いたPythonのアサーションに関するチュートリアルの要約です

Pythonのassertステートメントはデバッグの補助であり、実行時エラーを処理するメカニズムではありません。アサーションを使用する目的は、開発者がバグの根本的な原因をより迅速に見つけられるようにすることです。プログラムにバグがない限り、アサーションエラーが発生することはありません。


記事をありがとう。assertステートメントとこれを使用するタイミングを理解するのに非常に役立ちます。記事で紹介したいくつかの用語を理解しようとしています。
alpha_989 2018年

私はここにコメントを投稿するつもりだったので、より多くの人々が明確化の恩恵を受けることができるでしょう。質問が素朴すぎる場合は申し訳ありません。
alpha_989 2018年

リンクしたブログで、 `assert 0 <= price <= product ['price']`は正しいと述べたが、 `assert user.is_admin()、 'Must have admin admin rights to delete '` assert store.product_exists(product_id), 'Unknown product id'はお勧めできません。デバッグがオフになっuserているadminと、製品を削除できなくなるからです。あなたは考えるかassert user.is_admin()のようにunrecoverableエラー?これはなぜself-checkですか?
alpha_989

あなたがその「user.is_adminを考慮した場合() `ユーザの入力であるために使用すべきではありませんassert statementカントは、priceまた、ユーザの入力とみなされますか?なぜassert user.is_admin()データ検証と見なすのassert priceですか?
alpha_989

1
@LaryxDeciduaいいえ、私のウェブサイトで読むだけです。チュートリアルは公開されています。ニュースレターに興味がない場合は、エスケープキーを押すか、小さな「x」記号をクリックしてください。これがお役に立て
ば幸いです

51

他の人はすでにドキュメントへのリンクを提供しています。

対話型シェルで次のことを試すことができます。

>>> assert 5 > 2
>>> assert 2 > 5
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
builtins.AssertionError:

最初のステートメントは何もせず、2番目のステートメントは例外を発生させます。これが最初のヒントです。アサートは、コードの特定の位置(通常、関数の開始(前提条件)と終了(事後条件))でtrueになるはずの条件をチェックするのに役立ちます。

アサートは実際には契約によるプログラミングに強く結びついており、これは非常に便利なエンジニアリング手法です。

http://en.wikipedia.org/wiki/Design_by_contract


つまり、assert(2> 5)のような状況でコードをチェックインしてエラーを発生させ、それ以外の場合は続行できるということですか。

20
括弧をなくし、アサートは関数ではありません。
ピルムンチャー14

2
かっこをなくすことは、見かけよりも重要です。以下を参照してください。
Evgeni Sergeev 2015

6
Assertは実際には(「契約」のずっと前に)チューリングにさかのぼります。彼は、プログラマーが正しいプログラムを作成するというかなり困難な作業にどのように取り組むかに関する初期の論文の1つを書いたときです。すべてのプログラマーが彼の研究に慣れることで利益を得ることができるので、その論文を見つけることは読者のための練習問題として残されます。:-) turingarchive.org
Ron Burk

17

ドキュメントから:

Assert statements are a convenient way to insert debugging assertions into a program

ここであなたはもっと読むことができます:http : //docs.python.org/release/2.5.2/ref/assert.html


それが何であるかを非常に明白に説明しているだけなので、私はこのコメントが好きです。私の質問は、「適切な単体テストを作成したのに、なぜアサーションが必要なのですか?」とにかく、本番環境では動作しません。
dtc

17

assertステートメントには2つの形式があります。

単純な形式はassert <expression>、次と同等です。

if __debug__:
    if not <expression>: raise AssertionError

拡張形式はassert <expression1>, <expression2>、以下と同等です。

if __debug__:
    if not <expression1>: raise AssertionError, <expression2>

16

アサーションは、プログラムの内部状態がプログラマが期待したとおりであることを確認する体系的な方法であり、バグをキャッチすることを目的としています。以下の例を参照してください。

>>> number = input('Enter a positive number:')
Enter a positive number:-1
>>> assert (number > 0), 'Only positive numbers are allowed!'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: Only positive numbers are allowed!
>>> 

1
また、アサーションは多くの場合、ユニットテストプログラムで使用できます。 stackoverflow.com/questions/1383/what-is-unit-testing
2014年

7

これは簡単な例です。これをファイルに保存します(b.pyとしましょう)。

def chkassert(num):
    assert type(num) == int


chkassert('a')

そして結果は $python b.py

Traceback (most recent call last):
  File "b.py", line 5, in <module>
    chkassert('a')
  File "b.py", line 2, in chkassert
    assert type(num) == int
AssertionError

6

アサート後のステートメントがtrueの場合、プログラムは続行しますが、アサート後のステートメントがfalseの場合、プログラムはエラーになります。そのような単純な。

例えば:

assert 1>0   #normal execution
assert 0>1   #Traceback (most recent call last):
             #File "<pyshell#11>", line 1, in <module>
             #assert 0>1
             #AssertionError

4

assert声明は、ほとんどすべてのプログラミング言語に存在します。これは、他の操作の副作用としてではなく、原因が明らかなプログラムの早い段階で問題を検出するのに役立ちます。彼らは常にTrue状態を期待しています。

次のようなことをすると:

assert condition

その条件をテストし、それがfalseの場合はすぐにエラーをトリガーするようにプログラムに指示しています。

Pythonでは、assertexpressionは次と同等です。

if __debug__:
    if not <expression>: raise AssertionError

拡張式を使用して、オプションのメッセージを渡すことができます

if __debug__:
    if not (expression_1): raise AssertionError(expression_2)

Pythonインタープリターで試してください。

>>> assert True # Nothing happens because the condition returns a True value.
>>> assert False # A traceback is triggered because this evaluation did not yield an expected value.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

主にassertand ifステートメントを切り替えると考える人のためにそれらを使用する前に見られるいくつかの警告があります。使用する目的assertは、プログラムが条件を検証し、エラーをバイパスする別の方法をとるのではなく、プログラムをすぐに停止する必要がある値を返す場合です。

1.括弧

お気づきかもしれませんが、このassertステートメントでは2つの条件を使用しています。したがって、明確なアドバイスのために、括弧を使用して括弧を付けないでください。次のような場合:

assert (condition, message)

例:

>>> assert (1==2, 1==1)
<stdin>:1: SyntaxWarning: assertion is always true, perhaps remove parentheses?

最初のパラメーターとしてタプルを表すaを使用assertして(condition, message)を実行すると、Pythonで空でないタプルが常ににTrueなるため、これが発生します。ただし、問題なく個別に実行できます。

assert (condition), "message"

例:

>>> assert (1==2), ("This condition returns a %s value.") % "False"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: This condition returns a False value.

2.デバッグの目的

assertステートメントをいつ使用するかについて疑問がある場合。実際に使用されている例を見てみましょう:

*プログラムがユーザーまたは他の何かによって入力された各パラメーターを制御する傾向がある場合:

def loremipsum(**kwargs):
    kwargs.pop('bar') # return 0 if "bar" isn't in parameter
    kwargs.setdefault('foo', type(self)) # returns `type(self)` value by default
    assert (len(kwargs) == 0), "unrecognized parameter passed in %s" % ', '.join(kwargs.keys())

*別のケースは、特定の方程式の係数または定数として0または非正の場合の数学です。

def discount(item, percent):
    price = int(item['price'] * (1.0 - percent))
    print(price)
    assert (0 <= price <= item['price']),\
            "Discounted prices cannot be lower than 0 "\
            "and they cannot be higher than the original price."

    return price

*またはブール実装の簡単な例:

def true(a, b):
    assert (a == b), "False"
    return 1

def false(a, b):
    assert (a != b), "True"
    return 0

3.データ処理またはデータ検証

assertこのステートメントは、Pythonの初期化-Oまたは-OOフラグ(それぞれ値1、2、および0(デフォルト)を意味する)またはPYTHONOPTIMIZE環境変数でオフにできるため、データ処理またはデータ検証を実行するステートメントに依存しないことが最も重要です。 。

値1:

*アサートは無効です。

*バイトコードファイルは、の.pyo代わりに拡張子を使用して生成されます.pyc

* sys.flags.optimizeは1(True)に設定されます。

*そして、__debug__に設定されFalseます。

値2: 1つ以上のものを無効にします

* docstringsは無効です。

したがって、このassertステートメントを使用してある種の予期されるデータを検証することは非常に危険であり、いくつかのセキュリティ問題をも意味します。次に、いくつかの権限を検証する必要がある場合は、raise AuthError代わりにお勧めします。前提条件の効果として、assertは、ユーザーが直接操作しないライブラリまたはモジュールのプログラマーによって一般的に使用されます。


3

C2 Wikiに簡潔に要約されているように:

アサーションは、プログラムの特定のポイントでのブール式であり、プログラムにバグがない限り trueになります

assertステートメントを使用して、特定のプログラムポイントでのコードの理解を文書化できます。たとえば、入力(前提条件)、プログラムの状態(不変条件)、または出力(事後条件)に関する仮定または保証を文書化できます。

アサーションが失敗した場合、これはあなた(またはあなたの後継者)にとって、あなたがプログラムを書いたときのあなたのプログラムの理解が間違っていたこと、そしておそらくバグが含まれていることの警告です。

詳細については、John RegehrがUse of Assertionsに関するすばらしいブログ投稿を公開してassertいます。これはPython ステートメントにも適用されます。


2

予約済み関数がPythonで何をするかを正確に知りたい場合は、次のように入力します。 help(enter_keyword)

予約キーワードを入力する場合は、文字列として入力することを確認してください。


2

Python アサートは基本的に、コードの内部セルフチェックの条件をテストするデバッグ補助機能です。Assertは、コードが不可能なエッジケースに陥ったときにデバッグを非常に簡単にします。それらの不可能なケースを確認してください。

割引後の商品の価格を計算する関数があるとしましょう:

def calculate_discount(price, discount):
    discounted_price = price - [discount*price]
    assert 0 <= discounted_price <= price
    return discounted_price

ここでは、discounted_priceを0未満にして実際の価格より高くすることはできません。したがって、上記の条件に違反した場合、assertはアサーションエラーを発生させます。これは、開発者が不可能なことが起こったことを識別するのに役立ちます。

それが役に立てば幸い :)


2
assertデバッグコンテキストで役立ちますが、デバッグコンテキスト以外では信頼すべきではありません。
FluxIX 2018

2

私の簡単な説明は:

  • assertAssertionErrorexpressionがfalseの場合に発生します。それ以外の場合はコードを継続し、コンマがある場合はそれが何であれAssertionError: whatever after comma、コードは次のようになります。raise AssertionError(whatever after comma)

これに関する関連チュートリアル:

https://www.tutorialspoint.com/python/assertions_in_python.htm


答えはを使用する方法を提供しますassertを使用する(または使用しない)ときは提供しませんassert。また、assertが便利な場合__debug__は無効にできることに注意してくださいFalse
FluxIX 2018

1

あなたが使用している場合Pycharmでは、assert一緒にisinstanceオブジェクトの型を宣言するために、それはあなたがコーディングしている間、それは自動的にオートコンプリートはあなたが親オブジェクトのメソッドや属性にアクセスできるようになります。

たとえばself.object1.object2MyClassオブジェクトであるとしましょう。

import MyClasss

def code_it(self):
    testObject = self.object1.object2 # at this point, program doesn't know that testObject  is a MyClass object yet
    assert isinstance(testObject , MyClasss) # now the program knows testObject is a MyClass object
    testObject.do_it() # from this point on, PyCharm will be able to auto-complete when you are working on testObject

0

他の回答で書かれているように、assertステートメントは、特定の時点でのプログラムの状態をチェックするために使用されます。

関連するメッセージ、括弧、または-Oオプションと__debug__定数について言われたことは繰り返さない。直接の情報については、ドキュメントも確認してください。私はあなたの質問に焦点を当てます:何の使用assertですか?より正確には、いつ(そしてそうでない場合)を使用する必要がありますassertか?

assert文は、プログラムをデバッグするのに有用であるが、ユーザーの入力をチェックするために落胆しました。私は次の経験則を使用します。アサーションを保持して、これが発生してはならない状況を検出します。ユーザーの入力が正しくない可能性があります(たとえば、パスワードが短すぎるなど)が、これは起こり得ないケースではありません。円の直径が半径の2倍ではない場合、これは起こり得ないケースです。

私の心の中で最も興味深いのassertは、[オブジェクト指向のソフトウェア構築](https://www.eiffel.org/doc/eiffel/Object-Oriented_Software_Construction%)の B. Meyerによって説明されている契約によるプログラミングに触発された ものです。 2C_2nd_Edition )[Eiffelプログラミング言語](https://en.wikipedia.org/wiki/Eiffel_ (programming_language))で実装されてい ますassertステートメントを使用してコントラクトでプログラミングを完全にエミュレートすることはできませんが、意図を維持することは興味深いことです。

ここに例があります。head([ headHaskellの関数]( http://www.zvon.org/other/haskell/Outputprelude/head_f.html)のような)関数を書く必要があると想像してください。指定された仕様は、「リストが空でない場合、リストの最初の項目を返す」です。次の実装を見てください。

>>> def head1(xs): return xs[0]

そして

>>> def head2(xs):
...     if len(xs) > 0:
...         return xs[0]
...     else:
...         return None

(はい、これはと書くことができますがreturn xs[0] if xs else None、それはポイントではありません)

リストが空でない場合、両方の関数の結果は同じであり、この結果は正しいです。

>>> head1([1, 2, 3]) == head2([1, 2, 3]) == 1
True

したがって、どちらの実装も(私は願っています)正しいです。空のリストの先頭アイテムを取得しようとすると、これらは異なります。

>>> head1([])
Traceback (most recent call last):
...
IndexError: list index out of range

だが:

>>> head2([]) is None
True

繰り返しますが、空のリストをこれらの関数に渡してはならないため、どちらの実装も正しいです(仕様外です)。それは間違った呼び出しですが、そのような呼び出しを行うと、何が起こる可能性があります。1つの関数は例外を発生させ、もう1つの関数は特別な値を返します。最も重要なのは、この動作に依存できないことです。xs空の場合、これは動作します:

print(head2(xs))

しかし、これはプログラムをクラッシュさせます:

print(head1(xs))

予期せぬ事態を避けるために、予期しない引数を関数に渡すときを知りたいと思います。言い換えると、仕様ではなく実装に依存するため、観測可能な動作が信頼できない場合について知りたいのです。もちろん、私は仕様を読むことができますが、プログラマーは常にドキュメントを注意深く読むとは限りません。

次の効果を得るためにコードに仕様を挿入する方法があると想像してください。たとえば、空のリストをに渡すなどして仕様に違反するとhead、警告が表示されます。これは、正しい(つまり、仕様に準拠した)プログラムを作成するのに非常に役立ちます。そして、それassert はシーンに入るところです:

>>> def head1(xs):
...     assert len(xs) > 0, "The list must not be empty"
...     return xs[0]

そして

>>> def head2(xs):
...     assert len(xs) > 0, "The list must not be empty"
...     if len(xs) > 0:
...         return xs[0]
...     else:
...         return None

今、私たちは持っています:

>>> head1([])
Traceback (most recent call last):
...
AssertionError: The list must not be empty

そして:

>>> head2([])
Traceback (most recent call last):
...
AssertionError: The list must not be empty

head1スローAssertionError、ありませんIndexError。ので、それは重要なのAssertionErrorではない任意のランタイムエラー:それは仕様の違反を通知します。警告が必要でしたが、エラーが発生しました。幸い、私はチェックを無効にすることができ-Oます(オプションを使用して)が、私自身のリスクで。クラッシュは本当に高くつきますし、ベストを願っています。プログラムがブラックホールを通過する宇宙船に埋め込まれていると想像してください。アサーションを無効にし、プログラムができるだけ長くクラッシュしないように十分に堅牢であることを願っています。

この例は、assert事後条件(戻り値または状態、あるいはその両方)と不変条件(クラスの状態)をチェックするために使用できるという前提条件のみに関するものでした。を使用して事後条件と不変条件をチェックassertするのは面倒な場合があります。

  • 事後条件の場合、戻り値を変数に割り当てる必要があります。メソッドを処理している場合は、オブジェクトの初期状態を保存する必要があります。
  • 不変条件の場合、メソッド呼び出しの前後の状態を確認する必要があります。

エッフェルほど洗練されたものはありませんが、プログラムの全体的な品質を向上させることができます。


要約すると、このassertステートメントは、これが発生してはならない状況を検出する便利な方法です。仕様の違反(たとえば、空のリストをに渡すhead)は最初のクラスであり、これは状況では発生しません。したがって、このassertステートメントは予期しない状況を検出するために使用できますが、仕様が確実に満たされるようにするための特権的な方法です。assertコードにステートメントを挿入して仕様を表すと、不正な引数、不正な戻り値、不正なクラスの状態などが報告されるため、プログラムの品質が向上したことを願っています。


-2

format:assert Expression [、arguments] assertがステートメントを検出すると、Pythonは式を評価します。ステートメントがtrueでない場合は、例外が発生します(assertionError)。アサーションが失敗すると、PythonはAssertionErrorの引数としてArgumentExpressionを使用します。AssertionError例外は、try-exceptステートメントを使用して他の例外と同様にキャッチおよび処理できますが、処理されない場合、プログラムが終了し、トレースバックが生成されます。例:

def KelvinToFahrenheit(Temperature):    
    assert (Temperature >= 0),"Colder than absolute zero!"    
    return ((Temperature-273)*1.8)+32    
print KelvinToFahrenheit(273)    
print int(KelvinToFahrenheit(505.78))    
print KelvinToFahrenheit(-5)    

上記のコードを実行すると、次の結果が生成されます。

32.0
451
Traceback (most recent call last):    
  File "test.py", line 9, in <module>    
    print KelvinToFahrenheit(-5)    
  File "test.py", line 4, in KelvinToFahrenheit    
    assert (Temperature >= 0),"Colder than absolute zero!"    
AssertionError: Colder than absolute zero!    

-2
def getUser(self, id, Email):

    user_key = id and id or Email

    assert user_key

関数呼び出しでパラメーターが渡されるようにするために使用できます。


1
これは機能しますが、私が理解しているところによると、実行時にオフにすることができるため、ユーザー入力のチェックにはアサートを使用しないでください。ユーザー入力を強制または検証したい場合は、if not user_key: raise ValueError()最後の2段落をチェックしてください:wiki.python.org/moin/UsingAssertionsEffectively
alpha_989

assertの場合__debug__は検証が削除されるため、入力の検証には使用しないでくださいFalse。また、デバッグ以外の目的でアサーションを使用すると、結果AssertionErrorのをキャッチし、デバッグを難しくする可能性があります。
FluxIX 2018

-4
>>>this_is_very_complex_function_result = 9
>>>c = this_is_very_complex_function_result
>>>test_us = (c < 4)

>>> #first we try without assert
>>>if test_us == True:
    print("YES! I am right!")
else:
    print("I am Wrong, but the program still RUNS!")

I am Wrong, but the program still RUNS!


>>> #now we try with assert
>>> assert test_us
Traceback (most recent call last):
  File "<pyshell#52>", line 1, in <module>
    assert test_us
AssertionError
>>> 

-4

基本的に、assertキーワードの意味は、条件がtrueでない場合、assertionerrorを介して、それ以外の場合は、たとえばpythonで継続することです。

コード-1

a=5

b=6

assert a==b

出力:

assert a==b

AssertionError

コード-2

a=5

b=5

assert a==b

出力:

Process finished with exit code 0

2
コードを適切にフォーマットしてください。また、これは以前の回答をどのように改善しますか?
c2huc2hu 2017

私の説明に問題はありますか?
ujjwal_bansal 2017

あなたの説明は既存の答えに何も追加しません、そして文法が悪いと読みにくくなります。回答する質問を探している場合は、新しい質問フィードを閲覧することを検討してください。
c2huc2hu 2017

提供された回答は、の使用方法については回答assertしていますがを使用する(または使用しない)場合については回答ていませんassert
FluxIX 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.