我查看了一个similar问题,但它并没有真正回答我的问题。假设我有以下代码(过于简化以仅突出显示我的问题)。
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
文件,因为只有在我的程序开始执行后才能获得它。
答案 0 :(得分:7)
这个答案只是为了证明可以完成,但显然需要一个更好的解决方案来确保您包含要包含的类。
>>> 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
正文以查找要包含的元素,然后删除其余部分。
注意:这是一个巨大的黑客攻击。
答案 1 :(得分:1)
不,没有办法防止这些额外的行被执行。您可以做的最好的事情是阅读脚本并解析出类 - 使用它来创建您想要的类。
这可能比您想做的工作更多,但是,对于意志坚定的人来说,ast
模块可能会有所帮助。
答案 2 :(得分:1)
不,没有办法。至少并非没有极端的诡计......也就是说,如果你愿意破解一些奇怪的“解决方案”,几乎所有东西都可以在Python中使用。
“someones_class.py”来自哪里?你为什么不能改变它?我的意思是,编辑文件,而不是从代码中更改它。你能告诉写这篇文章的人不要在顶级编写排序测试代码吗?
这里隐藏着一个有趣的(有点重要的)关于Python的课程:“A类:”不是声明。它实际上是Python解释器在加载文件时执行的代码。