0

from module import *モジュール内の特定の名前がステートメントによってインポートされないようにして、名前空間の混乱を減らしたいと考えています。(これが悪い設計である場合はお知らせください。)

これが私が望む動作です(例としてosandを使用):posix

  • import os利用可能にする必要がos.posixあります。
  • from os import *利用可能にすべきではありませposixん。
  • from os import posix結果がエラーになるかどうかは気にしません。

インポートされたモジュールのコードが、またはmoduleでインポートされたかどうかを検出することは可能ですimport modulefrom module import *?

4

2 に答える 2

0

インポートされたモジュール 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 *

于 2013-10-11T00:13:52.277 に答える