質問

  1. い性能やコードの維持の問題を assert の一環として、標準コードを使用でデバッグです。

    assert x >= 0, 'x is less than zero'
    

    良きにつけ悪しきにつけもっともよ

    if x < 0:
        raise Exception, 'x is less than zero'
    
  2. また、本当にありがとう設定のビジネスルールのように 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四つの役割:

  1. お知らせアリス,Bernd、カール、Daphneうコードます。
    とする方法プロセスのリストタプルのプログラムロジックであればそのタプルは変更できません:

    def mymethod(listOfTuples):
        assert(all(type(tp)==tuple for tp in listOfTuples))
    

    これはよりも、より信頼性のあるものと同等の情報を文書化 とくるナンス性の向上にも寄与します。

  2. お知らせのコンピュータに何コードます。
    assert 制に適切な行動を呼び出し側のコードです。がコード通話AlicesのBerndのコードで通話したい。 しなの assert, の場合、プログラムの衝突にAlicesコード Berndと考えるかもしれでアリスは、 アリスの調査-と考えるかもしれました断層 するといBerndでした。多くの仕事を失った。
    との主張、誰が通っすぐに見ることができたので その誤りをなす。Alice,Bernd、すべます。保存に大きな額です。

  3. お知らせ-ジャーナルの読者コードを含むはお客様にてご用意ください)どのコードを達成しかねます。
    ときのリストを入れることができるように清潔で良い) することができsmorsh,trale,gullup、twinkled(ていないのどちらでもかまいません。まsmorshが必要ですunsmorshed;まtraleが必要ですbaludoed;まgullupで調査開始が遅(およびそれペースが...まtwinkledが必要ですtwinkled再び木曜日を除く.の考:この複雑なんですよ。その結果は、ことあるべきであるエディトリアルデザインを洗浄されているようにする。右もふもふをご堪能ください(TM)は言により、効果の 洗浄ループとして

    assert(all(entry.isClean() for entry in mylist))
    

    この結保存し、頭痛、誰でも理解しようと 何 正確に この素晴らしいループは高まる一方です。最も頻繁にこれらの人々に見えます。

  4. お知らせのコンピュータに何コードを達成しかねます。
    だに忘れるペエントリが必要で駆け巡, の 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!
    

    は安いものが漁の 実際の プログラムエラー。

答えビジネスルールを主張するために、実行時の監視を行い、Java用のDroolsはrel="nofollow">のJBossの

る主張をチェックイン
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()文は、いくつかの不明確なオブジェクトのためのコード補完を有効にするために使用することができます。

あなたはにはならないhref="https://stackoverflow.com/a/945135/174365">にもかかわらず、適切に機能するためにassertに依存しているレガシーコードを扱っている場合は、あなたがリファクタリングする時間を見つけるまで、次のコードを追加すると、簡単な修正です。

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
scroll top