2012-09-07 10 views
20

では許可されていない、あなたが最後に表示されます:Pythonの:あなたは、モジュールからコンパイルPythonバイトコードを見れば、なぜ `return`モジュール

10 LOAD_CONST    0 (None) 
13 RETURN_VALUE   

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

SyntaxError: 'return' outside function 

なぜですか?


これはもちろん言語設計の決定です。しかし、なぜそれが取られたのですか? returnは、しばしばモジュールで非常に便利です。例えば。私は時々、モジュールの先頭で、このコードを書きたい:

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

そして、私は(それは私が望んでいないモジュールはないロードにつながるので)そこに例外を発生させる必要はありません。


は実は、私はその場でPythonのバイトコードを操作し、ちょうどリターン(復帰が行われる最後までまたは私の場合にはジャンプを)行うことができます一緒にいくつかのコードをハッキング。これは機能します。 CPythonだけの理由は、コードオブジェクトを操作する標準的な方法がないためです。

Hereです。可能な回答については


:私は本当の証拠、いくつかの過去のグイド・ヴァンロッサムからの声明またはので、これについて、あまりないだけで任意のランダムな議論を好むだろう。私はもちろん、(すでに提示されているように)これは両方の利点と私自身の欠点ですが、私は実際にそれに対して大きな理由は見ません。

+2

なぜ例外は発生しませんか?実行を停止し、呼び出し元が例外をリッスンするまでの理由を返す –

+1

@JoranBeasley:モジュールをロードしません。私はまだモジュールをロードしたい場合について話しています。 – Albert

+1

は、ユーザーがインポートできる別のモジュールを持っています。サポートされていないとサポートされていないはずです... '__init __。py'で' try:import no_linux2;例外:import alt_implementation as no_linux2' –

答えて

6

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

私はこれを処理するための最も無駄な方法は、ImportErrorまたはNotImplementedErrorを挙げることだと思います。次にユーザは、このモジュールなしで暮らして(例外をキャッチすることによって)生き残ることができるかどうか、またはそのプログラムがクラッシュしてそこに燃え尽きるかどうかを判断できます。

+1

モジュールからの戻り値を呼び出す理由を考えています... –

+0

これは通常は強制的に実行されないPythonでは非常に珍しいことです多く(反対の多く)。 – Albert

+0

@Albert - これも*強制しません。モジュール全体を 'if-elif-else'節に自由に囲むことができます。小さなモジュール(あなたが言うように)のために、これはオプションかもしれません... – mgilson

関連する問題