3

関数/メソッドが発生させる例外を「検出」する方法はありますか? 例:

def foo():
    print 'inside foo, next calling bar()'
    _bar()
    _baz()
    # lots of other methods calls which raise other legitimate exceptions

def _bar():
    raise my_exceptions.NotFound

def _baz():
    raise my_exceptions.BadRequest

foo が API の一部であり、それを文書化する必要があると仮定すると、それから発生する可能性のあるすべての例外を取得する方法はありますか?

明確にするために、これらの例外を処理したくありません。それらは発生するはずです(たとえば、リソースが見つからない場合、またはリクエストの形式が正しくない場合)。

そのコードのシーケンスを次のような「インライン」に変換するツールを作成することを考えています。

def foo():
    print 'inside foo, next calling bar()'
    # what _bar() does
    raise my_exceptions.NotFound
    # what _baz() does
    raise my_exceptions.BadRequest
    # lots of other methods calls which raise other legitimate exceptions

各メソッド呼び出しをナビゲートする代わりに、それを検出するのに役立つものはありますか? (これはいくつかのファイルに深く入ります。)

4

2 に答える 2

4

いくつかの理由から、これを Python で合理的に行うことはできません。

1) Python プリミティブは、スローできる例外を正確に文書化していません。Python の精神は、いつでもどんな例外でもスローできるということです。

2) Python の動的な性質により、コードを静的に分析することは非常に難しくなります。コードが何を「実行できるか」を知ることはほとんど不可能です。

3) あらゆる種類の興味のない例外をリストに含める必要があります。たとえば、 がある場合、AttributeErrorが発生self.fooする可能性があります。それが存在しなければならないことを理解するには、非常に洗練されたアナライザーがfoo必要です。

于 2012-12-26T21:05:18.697 に答える
3

いいえ、Python の動的な性質のためです。関数が実行時に別の関数を選択した場合 (非常に一般的)、またはコードが後でモンキーパッチされた場合、ツールはどのように機能しますか?

インタプリタが静的解析を通じて何をしようとしているのかを事前に知る方法はまったくありません (十分な状況で有用です)。インタプリタを効果的に実行し、何が起こるかを確認する必要があります。もちろん、実行ごとに変化する可能性があります...

于 2012-12-26T21:03:16.417 に答える