如何在没有导入的情况下获取python模块中定义的所有变量?

时间:2018-05-02 15:16:01

标签: python

例如,如果我有以下结构:

base.py

foo = 1
bar = 2

extended.py

from base import *

baz = 3
qux = 4

我希望只获取extended.py中定义的变量。

我尝试过使用dir和'inspect',

import inspect
import extended
vars = dir(extended)
members = inspect.getmembers(extended)

但这会产生vars = ['bar', 'baz', 'foo', 'qux', ...]members=[('bar', 2), ('baz', 3), ('foo', 1), ('qux', 4), ...]

有没有在python中实际执行此操作,给定了如何定义extended.py的结构?

3 个答案:

答案 0 :(得分:0)

我决定为个人兴趣提供一个bash,它可能适用于你想要的东西,我还没有看到更复杂的任务如何工作,例如切片分配等:

import ast

with open("extended.py") as f:
    code = f.read()

tree = ast.parse(code)

assignments = [
    node
    for node in ast.walk(tree)
    if isinstance(node, ast.Assign)
]

target_variables = set()
for a in assignments:
    print("{}: {}".format(a, ast.dump(a)))
    for target in a.targets:
        target_variables.add(target.id)

print("Found {} assignments to these variable names:".format(len(assignments)))
print(target_variables)

答案 1 :(得分:0)

我找到了一种简单的方法,这可能并不完美,但它会起作用:

getItem

遗憾的是,这也会返回使用def find_names_of_module(module): code = compile(open(module.__file__).read(), module.__name__, "exec") return code.co_names from module import *导入的模块以及函数。如果你不想要它们,你可以过滤它没有模块和功能。

如果您只需要顶级变量名称,这里是Tom Dalton答案的调整,其中只包含顶级变量:

import module

答案 2 :(得分:0)

如果你可以改变结构,我会选择这个解决方案:

<强> base.py

foo = 1
bar = 2

<强> extension.py

baz = 3
qux = 4

<强> extended.py

from base import *
from extension import *

否则,我不确定这段代码是否真的有用, 必须有更好的方式 ,但你可以使用模块成员之间的区别:

import inspect
import base
import extended
base_members = inspect.getmembers(base)
ext_members = inspect.getmembers(extended)
ext_only_members = [member for member in ext_members if member not in base_members]

由于列表内容不可清除,因此无法使用集合来获取差异。