1

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,それ=自体はclassor内ではありませんdefが、それは巨大な PITA のように思われ、純粋な Python ではなく C/C++ で実装されているモジュールでは機能しないと思います。

もう 1 つの可能性は、出力がリダイレクトされた子 Python インスタンスを起動してdevnullそこでチェックを実行し、時間がかかりすぎる場合は強制終了することです。これで最初の 4 つの箇条書きが解決されantigravityます。しかし、この単一の関数で Python の何千ものインスタンスを起動しなければならないのは、少し... 重くて非効率的です。

私が考えていないより良い解決策を誰かが持っていますか? たとえば、モジュールを実際にインポートせずに、PythonにASTなどを生成するように指示する簡単な方法はありますか?

4

1 に答える 1