4

同様の質問を見ましたが、私が持っている質問には実際には答えていません。次のコードがあるとします(私の質問だけを強調するために非常に単純化されています)。

class A:
    def __init__(self,x):
        self.val = x

a = A(4)
print a.val

このコードはファイルにありますsomeones_class.pyを変更せずAに、自分のプログラムでクラスをインポートして使用したいと考えています。私がそうしても、pythonはファイル内のスクリプト行を実行します。 someones_class.pyfrom someones_class import A

質問:A最後の 2 行を実行せずにクラスをインポートする方法はありますか?

私はそのことについて知っていますが、プログラムの実行が開始された後にのみ取得されるため、ファイルif __name__ == '__main__'を変更するオプションはありません。someones_class.py

4

3 に答える 3

8

この答えは、それが可能であることを示すためのものですが、含めたいクラスを確実に含めるには、明らかにより良い解決策が必要です。

>>> code = ast.parse(open("someones_class.py").read())
>>> code.body.pop(1)
<_ast.Assign object at 0x108c82450>
>>> code.body.pop(1)
<_ast.Print object at 0x108c82590>
>>> eval(compile(code, '', 'exec'))
>>> test = A(4)
>>> test
<__main__.A instance at 0x108c7df80>

code含めたい要素の本体を検査し、残りを削除できます。

注:これは巨大なハックです。

于 2013-04-23T19:29:30.443 に答える
2

いいえ、これらの余分な行が実行されるのを防ぐ方法はありません。あなたができる最善の方法は、スクリプトを読んでクラスを解析し、それを使用して必要なクラスを作成することです。

これはおそらくあなたがやりたいよりもはるかに多くの作業ですが、意志の強い人にとっては、astモジュールが役立つかもしれません.

于 2013-04-23T19:07:41.770 に答える
2

いいえ、仕方がありません。少なくとも極端な策略がないわけではありません... つまり、奇妙な「解決策」をハックする気があれば、ほとんどすべてが Python で可能です。

その「someones_class.py」はどこから来たのですか? なんで変えないの?つまり、コードから変更するのではなく、ファイルを編集します。それを書いた人に、トップレベルでソートテストコードを書かないように言うことができますか?

ここに、Python に関する興味深い (そしてちょっと重要な) 教訓が隠されています。「class A:」は宣言ではないということです。実際には、ファイルをロードするときに Python インタープリターが実行するコードです。

于 2013-04-23T19:09:21.163 に答える