25

モジュールからコンパイルされた Python バイトコードを見ると、最後に次のように表示されます。

10 LOAD_CONST               0 (None)
13 RETURN_VALUE        

つまり、 areturnはモジュールのルート レベルで完全に有効です。ただし、ソース コードで使用しようとすると、次のようになります。

SyntaxError: 'return' outside function

なんで?


もちろん、これは言語設計上の決定です。しかし、なぜそれが取られたのですか?Areturnは、モジュールで非常に役立つことがよくあります。たとえば、モジュールの先頭に次のコードを書きたいことがあります。

import sys
if sys.platform != "linux2":
    print "your platform is not yet supported"
    # define some stubs
    def foo(): pass
    def bar(): pass
    return

そして、そこで例外を発生させたくありません (モジュールがロードされず、望ましくないため)。


実際、私は Python バイトコードをオンザフライで操作し、ただ return を実行できる (または私の場合は return が行われた最後にジャンプする) いくつかのコードを一緒にハックしました。これは機能します。CPython のみである唯一の理由は、コード オブジェクトを操作する標準的な方法がないためです。

これがコードです。


考えられる答えについては、ランダムな議論ではなく、実際の証拠、グイド・ヴァン・ロッサムの過去の発言などを好みます。もちろん、これは利点(すでに提示されているように)と欠点の両方について自分自身で行うことができますが、それに対する大きな理由は実際にはわかりません.

4

2 に答える 2

7

これは、モジュールのユーザーにシステムがサポートされていないという事実に対処することを強制するため、これはpython開発者の決定であると思います(モジュールの開発者に何が起こるかを推測させるのではなく) . module.foo()Windows マシンでコードを実行すると、突然期待どおりに動作しなくなったときの彼らの驚きを想像してみてください。(警告printステートメントは、stdout にダンプされる可能性のある他のあらゆる種類のガベージに完全に埋もれている可能性があります)。

ImportErrorこれを処理する最も奇抜な方法は、 orを上げることだと思いますNotImplementedError。次に、ユーザーは、このモジュールがなくても続行できるかどうか (例外をキャッチすることによって)、またはプログラムがクラッシュしてその場で焼き尽くされるかどうかを決定できます。

于 2012-09-07T04:43:33.647 に答える