インポートされたモジュール module 内のコードが、 import module でインポートされたか、モジュール import * からインポートされたかを検出することは可能ですか?
はい、少なくとも CPython では。しかし、それはあまり有用なことではありませんし、あなたが解決したいと思っていた問題を確実に解決することにもなりません。もちろん、 mgilson が示すように、正しい答えは を使用することです。__all__
しかし、なぜこれが間違った答えなのかを示しましょう。
まず、これを行う1つの方法を次に示します。
import sys
import opcode
f1 = sys._getframe(1)
op = f1.f_code[f1.f_lasti+3]
del f1
if op == opcode.opmap['IMPORT_FROM']:
print('from me import something')
elif op == opcode.opmap['IMPORT_STAR']:
print('from me import *')
elif op == opcode.opmap['STORE_NAME']:
print('import me')
では、その情報を入手したところで、その情報で何ができるでしょうか。posix
ケースに入れないIMPORT_STAR
?あなたのモジュールはそれがなくても動作しますか?
その上、モジュールは複数回インポートできることを覚えておいてください。あるモジュールが でインポートしimport foo
、後で別のモジュールがインポートした場合from foo import *
、どうしたいですか? そして、答えがあったとしても、モジュール コードが最初にしか実行されないことを考えると、どうすればそれができるでしょうか? 他の誰かが後で行くことを検出するには、未来を見なければなりませんfrom foo import *
。