name
の原因となった が与えられた場合、それを解決するために編集NameError
できる Python パッケージを識別できる関数が必要です。import
その部分はかなり簡単で、私はそれを実行しましたが、別の問題があります。副作用を引き起こさずに実行したいのです。これが私が今使っているコードです:
def necessaryImportFor(name):
from pkgutil import walk_packages
for package in walk_packages():
if package[1] == name:
return name
try:
if hasattr(__import__(package[1]), name):
return package[1]
except Exception as e:
print("Can't check " + package[1] + " on account of a " + e.__class__.__name__ + ": " + str(e))
print("No possible import satisfies " + name)
問題は、このコードが実際には__import__
すべてのモジュールであるということです。これは、すべてのモジュールをインポートすることのすべての副作用が発生することを意味します。コードをテストしたところ、すべてのモジュールをインポートすることによって引き起こされる可能性のある副作用には次のようなものがあることがわかりました。
- tkinter アプリケーションの起動
- でパスワードを要求する
getpass
- その他
input
またはraw_input
- メッセージの印刷 (
import this
) - ウェブサイトを開く (
import antigravity
)
私が考えた可能な解決策は、すべてのモジュールへのパスを見つけることです(どうやって?これを行う唯一の方法はimport
、モジュールを ing し、そこからいくつかのメソッドを使用するinspect
ことです)、それを解析してすべてを見つけることclass
です , def
,それ=
自体はclass
or内ではありませんdef
が、それは巨大な PITA のように思われ、純粋な Python ではなく C/C++ で実装されているモジュールでは機能しないと思います。
もう 1 つの可能性は、出力がリダイレクトされた子 Python インスタンスを起動してdevnull
そこでチェックを実行し、時間がかかりすぎる場合は強制終了することです。これで最初の 4 つの箇条書きが解決されantigravity
ます。しかし、この単一の関数で Python の何千ものインスタンスを起動しなければならないのは、少し... 重くて非効率的です。
私が考えていないより良い解決策を誰かが持っていますか? たとえば、モジュールを実際にインポートせずに、PythonにASTなどを生成するように指示する簡単な方法はありますか?