モジュール自体の内部のモジュールへの参照を取得するにはどうすればよいですか?


158

そのモジュール内からモジュールへの参照を取得するにはどうすればよいですか?また、そのモジュールを含むパッケージへの参照を取得するにはどうすればよいですか?


7
モジュールスコープに変数があり(たとえば、関数またはクラスの外側にBLAH = 10)、次にBLAHという名前のクラス/関数変数があり、区別したいので、この質問をしているのではないかと思います。ここでの有効な質問は次のとおりです。これは必要ですか? スコープルールは、特にあなたの後(つまり6か月後)にコードを取得する 'ばか'によって、間違いを犯しがちです。このようなトリックが必要になることはほとんどありません。それらはしばしば混乱し、後で誤って変更されるため、完全に回避しようとします。
Kevin J. Rice

2
@ KevinJ.Rice「あなたの後(つまり、あなた、6か月後)にコードを拾う 'ばか'」が私の一日を作りました!
arctelix 2014年

8
なぜ彼が質問をしているのか、誰が気にするのでしょうか。これを行う必要がある正当な理由はたくさんあります。
クリストファーバーバー

閉鎖する必要があります。あまりにも便利です。
mlvljr

回答:


211
import sys
current_module = sys.modules[__name__]

3
これを除いて、モジュールがリロードされた場合は正しくありません。参照が保持されることが保証されている場所はないと思います。もしあったとしても、リロードは実際には機能しませんよね?
Dima Tisnek 2013年

14
リロードは同じモジュールオブジェクトを再利用します。新しいモジュールオブジェクトは作成されないので、再ロードしてもまだ正しいです。
bukzor 2013年

18

sysモジュールをインポートしないもう1つのテクニック、そしておそらく-好みに応じて-より簡単です:

current_module = __import__(__name__)

インポートがないことに注意してください。Pythonは各モジュールを1回だけインポートします。


これは、sysのインポートを回避する本当に良い方法のようです。読むのが直感に反する以外に、このアプローチには潜在的な欠点がありますか?
JeremyDouglass 2017年

@JeremyDouglass。私が知っていることではありません。importは、文書化された正当な組み込み関数です(唯一のxx関数)。'importlib'パッケージで置き換えることができます(インポートする必要があります)。多分-私には決して起こらなかった-同じ名前のモジュールがsys.pathで利用可能な場合、相対/絶対インポートで問題が発生する可能性があり、その場合は関数の 'level'引数で解決できます。
Uri

16

そのモジュールにクラスがある場合、クラスの__module__プロパティはクラスのモジュール名です。したがって、を介してモジュールにアクセスできますsys.modules[klass.__module__]。これは関数でも機能します。


4
実際、(少なくとも)関数の場合、__module__プロパティはモジュールではなく文字列のようです。したがって、inspect.getabsfile(func.__module__)TypeError: 'os' is not a module、class、method、function、traceback、frame、or code object "; inspect.getabsfile(sys.modules[o.__module__])通過しているようです。
sdaau 2013

12

現在のモジュールの名前を取得するには、 __name__

モジュール参照はsys.modules辞書にあります。

Pythonのドキュメントを参照してください


1

あなたはそれを外部から渡すことができます:

mymod.init(mymod)

理想的ではありませんが、それは私の現在のユースケースで機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.