2012-04-11 12 views
15

モジュール内の関数を動的に定義し、モジュールの__all__と関数の__name__属性を、モジュール内の名前と一致するように更新しています。関数の__module__属性を更新して、関数が存在するモジュールを指すようにするのが良い考えかどうか疑問に思っていました。ドキュメントでは、__module__は:__module__の意味論

が定義されているモジュールの名前です。使用できない場合は、Noneです。

関数を作成するコードは、関数が存在するモジュールとはほとんど関係のない別のモジュールにあります。このモジュールの関数への参照はありません。

私はメーリングリストでいくつかのことをやってきましたが、__module__のセマンティクスについてはちょっと混乱しています。もしそれをNoneに設定するのであれば、関数が存在するモジュールか、関数を作成したコードが存在します。今のところそれを残すつもりですが、答えを知っている人がいるかどうかを知ることに興味があります。

答えて

6

私はそれをしません。あるモジュールから別のモジュールに関数をインポートするのが一般的です。 __module__プロパティは、関数が定義されたモジュールを取得するためのもので、ソースコードを読み込むか、スクリプトで再インポートすることがあります。定義が静的なコードであるかダイナミックであるかに大きな違いがないことが分かります。誰かがあなたの関数のソースコードを読んでみたいのであれば、動的に作成するモジュールを調べるべきです。

PEP 3130をご覧ください。それは拒否されましたが、__module__の目的を他の場所に見られる単一の文章の説明よりもより洞察するかもしれません。

1

通常、暗い魔法や関数がどこからデバッグされたのかを知るために使用されることがありますが、ほとんどの場合、誰もそれを無視します。あなたの本当に心配している場合__module__ = "dynamically_defined_function"または何か類似したセット。

+1

この深刻な魔法は、気になるかもしれないいくつかの場所で起こります(IIRCピクルは、読み込み時にクラスを見つけるためにIIRCピックルを使用します)、デバッグには非常に便利です。 – delnan

+1

ピックルは、人々が考えるように頻繁に起こらない –

+0

"* may * care"。あなたは問題ではない多くの状況があることは間違いありません。しかし、あなた自身で何も魔法をしていないときに、あなたが "正しい"価値を「必要とする」可能性もあります。 – delnan