国際的なエンジニアチームは、Pythonを主張する
質問
い性能やコードの維持の問題を
assert
の一環として、標準コードを使用でデバッグです。は
assert x >= 0, 'x is less than zero'
良きにつけ悪しきにつけもっともよ
if x < 0: raise Exception, 'x is less than zero'
また、本当にありがとう設定のビジネスルールのように
if x < 0 raise error
して常に確認せずにtry/except/finally
そのため、いつでも全体のコードx
以下は0、エラーが起のように設定した場合assert x < 0
の開始時に機能などの機能がx
なし0に例外が発生します?
解決
は、xは関数全体ゼロ未満になったときに自動的にエラーをスローすることができるように。あなたはクラス記述子を使用することができます。ここでは例があります:
class LessThanZeroException(Exception):
pass
class variable(object):
def __init__(self, value=0):
self.__x = value
def __set__(self, obj, value):
if value < 0:
raise LessThanZeroException('x is less than zero')
self.__x = value
def __get__(self, obj, objType):
return self.__x
class MyClass(object):
x = variable()
>>> m = MyClass()
>>> m.x = 10
>>> m.x -= 20
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "my.py", line 7, in __set__
raise LessThanZeroException('x is less than zero')
LessThanZeroException: x is less than zero
他のヒント
の条件をテストするために使用する必要がありますアサートし、の発生しません。目的は、壊れたプログラム状態の場合には早期にクラッシュすることがある。
例外が発生する可能性が考えられる、とのあなたは、ほとんどの場合を独自の例外クラスを作成する必要があります。
エラーのために使用すべきです <時間> あなたはdict
に構成ファイルから読み出す機能を書いている場合は、あなたがConfigurationSyntaxError
を戻ろうじゃないことをassert
ことができますが、たとえば、ファイル内の不適切なフォーマットは、None
を上げる必要があります。
x
は、ユーザインタフェースを介して、または外部から設定された値である場合は、あなたの例では、例外が最良である。
x
は、同じプログラムで独自のコードで設定されている場合は、、アサーションと一緒に行きます。
"を主張する"という記述を取り除き、正常にコンパイルできているこの最適化.であり、インベスターズ-サービスの機能ます。
現在のコードジェネレータを放出しないコードを用を主張する声が最適化は必要でコンパイルす。- Python2.6.4Docs
ご利用の場合 assert
実施応機能、最適化の展開を生産する問題に取り組む"もので作品-イン-dev"です。
見 PYTHONOPTIMIZE や -O/-OO
の目的 assert
当事務所200,000ラインのコードと同僚のアリスをはじめ、Bernd、カール、Daphne.そのコースにより、お話します。
その assert
は 四つの役割:
お知らせアリス,Bernd、カール、Daphneうコードます。
とする方法プロセスのリストタプルのプログラムロジックであればそのタプルは変更できません:def mymethod(listOfTuples): assert(all(type(tp)==tuple for tp in listOfTuples))
これはよりも、より信頼性のあるものと同等の情報を文書化 とくるナンス性の向上にも寄与します。
お知らせのコンピュータに何コードます。
assert
制に適切な行動を呼び出し側のコードです。がコード通話AlicesのBerndのコードで通話したい。 しなのassert
, の場合、プログラムの衝突にAlicesコード Berndと考えるかもしれでアリスは、 アリスの調査-と考えるかもしれました断層 するといBerndでした。多くの仕事を失った。
との主張、誰が通っすぐに見ることができたので その誤りをなす。Alice,Bernd、すべます。保存に大きな額です。お知らせ-ジャーナルの読者コードを含むはお客様にてご用意ください)どのコードを達成しかねます。
ときのリストを入れることができるように清潔で良い) することができsmorsh,trale,gullup、twinkled(ていないのどちらでもかまいません。まsmorshが必要ですunsmorshed;まtraleが必要ですbaludoed;まgullupで調査開始が遅(およびそれペースが...まtwinkledが必要ですtwinkled再び木曜日を除く.の考:この複雑なんですよ。その結果は、ことあるべきであるエディトリアルデザインを洗浄されているようにする。右もふもふをご堪能ください(TM)は言により、効果の 洗浄ループとしてassert(all(entry.isClean() for entry in mylist))
この結保存し、頭痛、誰でも理解しようと 何 正確に この素晴らしいループは高まる一方です。最も頻繁にこれらの人々に見えます。
お知らせのコンピュータに何コードを達成しかねます。
だに忘れるペエントリが必要で駆け巡, のassert
保存および回ることを避けるためにコード 休憩愛Daphneもあります。
心 assert
's二つの目的のドキュメント(1および3)
保護(2および4)でも貴重。
知る人ている可能性もあります 以上 貴重なりに通知し、コンピュータ
ですのを防止することができる非常に間違いの assert
をとらえようとする場合1)
たっぷりのその後のミス。
他の回答に加えて、自身が例外が、唯一のAssertionErrorsを投げる主張します。功利主義の観点から、アサーションはあなたがキャッチした例外の上に微細結晶粒制御を必要とするときには適していません。
このアプローチには本当に間違っている唯一のものは、それがアサート文を使用して非常にわかりやすいの例外を作るのは難しいということです。あなたは簡単な構文を探しているなら、はまた、このような何かを行うことができますが、を覚えています:
class XLessThanZeroException(Exception):
pass
def CheckX(x):
if x < 0:
raise XLessThanZeroException()
def foo(x):
CheckX(x)
#do stuff here
もう一つの問題は、通常の状態チェックのために主張し使用することは、それが困難-Oフラグを使用してアサートデバッグを無効にできることがあるということです。
、アサーションを使用する必要があります。おそらく、私はアサーションを使用するために見ることができる最も有用な理由は不変/プリ/事後条件です。これらは、ループや関数の各反復の開始または終了時に真でなければなりません何かあります。
例えば、再帰関数(2つの別々の機能はそれほど1は不正な入力を処理し、それは再帰と区別することは難しい引き起こす他は、不正なコードを処理します)。私は、if文を書くのを忘れて、何が間違っていた場合、これは、それが明らかになるだろう。
def SumToN(n):
if n <= 0:
raise ValueError, "N must be greater than or equal to 0"
else:
return RecursiveSum(n)
def RecursiveSum(n):
#precondition: n >= 0
assert(n >= 0)
if n == 0:
return 0
return RecursiveSum(n - 1) + n
#postcondition: returned sum of 1 to n
これらのループ不変条件は、多くの場合、アサーションで表すことができる。
英語の単語 を主張する こちらではの感 誓う, 確認, avow.味にな "チェックイン" または "すべき".ことにな す としてのメリカ-サンフランシスコ、 罵声明 こちら:
# I solemnly swear that here I will tell the truth, the whole truth,
# and nothing but the truth, under pains and penalties of perjury, so help me FSM
assert answer == 42
コードが正しい発着信規制" シングルイベント惧, ハードウェア障害など のない主張であり、今後も失敗.だからこそ、行動のプログラムエンドユーザーにはならない。特に、主張して報告しなければなりません。も 例外ポ条件.でいます。このプログラマはzappedます。
は り性能。
を忘れないようにしてください "そして最初にご利用いただきますようよろしで速い".
非常に少数の割当プログラムは、通常、関連するそのスピード。まず蹴り出しまたは簡素化するassert
まんが っていただきます問題のほとんどしています。する実践的な:
とする方法プロセスは、空のリストタプルのプログラムロジックが破れの入ったタプルでない変更できません。も書き:def mymethod(listOfTuples): assert(all(type(tp)==tuple for tp in listOfTuples))
この微場合はリストのがすることができるものと作品長が 大きな問題を持っている場合は万人のための助言を行います。ではなく、投棄はこの貴重なチェック完全にでき 単に確認で
def mymethod(listOfTuples): assert(type(listOfTuples[0])==tuple) # in fact _all_ must be tuples!
は安いものが漁の 実際の プログラムエラー。
る主張をチェックイン
1.有効な状態
2.有効な、
3.真理;
のソースコード。代わりに失敗プロジェクト全体でアラームであることは適切ではなソースファイルです。
例1日以降、変数'strができるようになりnul.なので何を主張するまたは例外を取得します。
例1:
#!/usr/bin/python
str = 'hello Pyhton!'
strNull = 'string is Null'
if __debug__:
if not str: raise AssertionError(strNull)
print str
if __debug__:
print 'FileName '.ljust(30,'.'),(__name__)
print 'FilePath '.ljust(30,'.'),(__file__)
------------------------------------------------------
Output:
hello Pyhton!
FileName ..................... hello
FilePath ..................... C:/Python\hello.py
例2,var'strはnul.そのユーザーから先の不良によるプログラム を主張する ます。
例2:
#!/usr/bin/python
str = ''
strNull = 'NULL String'
if __debug__:
if not str: raise AssertionError(strNull)
print str
if __debug__:
print 'FileName '.ljust(30,'.'),(__name__)
print 'FilePath '.ljust(30,'.'),(__file__)
------------------------------------------------------
Output:
AssertionError: NULL String
その瞬間にならないようにしたい。デバッグを現実の主張の問題のソースコード。無効フラグの最適化
python-O assertStatement.py
何もないまま印刷
IDEのようにPTVS、PyCharmなどでは、ウィングassert isinstance()
文は、いくつかの不明確なオブジェクトのためのコード補完を有効にするために使用することができます。
try:
assert False
raise Exception('Python Assertions are not working. This tool relies on Python Assertions to do its job. Possible causes are running with the "-O" flag or running a precompiled (".pyo" or ".pyc") module.')
except AssertionError:
pass