4

我看了一个类似的问题,但它并没有真正回答我的问题。假设我有以下代码(过于简化以仅突出显示我的问题)。

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

a = A(4)
print a.val

此代码位于一个文件中someones_class.py。我现在想A在我的程序中导入和使用类而不修改 someones_class.py. 如果我这样做from someones_class import A,python 仍然会执行文件中的脚本行。

问题:有没有办法只导入类A而不执行最后两行?

我知道这if __name__ == '__main__'件事,但我没有修改someones_class.py文件的选项,因为它是在我的程序开始执行后才获得的。

4

3 回答 3

8

This answer is just to demonstrate that it can be done, but would obviously need a better solution to ensure you are including the class(es) you want to include.

>>> 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>

You could inspect the code body for the elements you want to include and remove the rest.

NOTE: This is a giant hack.

于 2013-04-23T19:29:30.443 回答
2

不,没有办法阻止这些额外的行被执行。你能做的最好的就是阅读脚本并解析出类——用它来创建你想要的类。

这可能比您想做的工作要多得多,但是对于意志坚强的人来说,该ast模块可能会有所帮助。

于 2013-04-23T19:07:41.770 回答
2

不,没有办法。至少不是没有极端的诡计......也就是说,如果你愿意破解一些奇怪的“解决方案”,那么在 Python 中几乎所有事情都是可能的。

“someones_class.py”是从哪里来的?为什么你不能改变它?我的意思是,编辑文件,而不是从您的代码中更改它。你能告诉写它的人不要在顶层编写排序测试代码吗?

这里隐藏了一个关于 Python 的有趣(而且有点重要)的教训:“A 类:”不是声明。它实际上是 Python 解释器在加载文件时执行的代码。

于 2013-04-23T19:09:21.163 回答