[英]Python: How to get all of the local variables defined in another module
[英]How to get all of the variables defined in a python module without imports?
例如,如果我具有以下結構:
base.py
foo = 1
bar = 2
擴展名
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', ...]
和vars = ['bar', 'baz', 'foo', 'qux', ...]
members=[('bar', 2), ('baz', 3), ('foo', 1), ('qux', 4), ...]
鑒於定義了extended.py的這種結構,在Python中是否有實際執行此操作的方法?
我決定為個人興趣而設置這個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)
我發現了一種比較簡單的方法,雖然可能並不完美,但是可以正常工作:
def find_names_of_module(module):
code = compile(open(module.__file__).read(), module.__name__, "exec")
return code.co_names
可悲的是,這確實還會返回from module import *
或import module
以及功能。 如果不需要它們,可以對其進行過濾以使其不具有模塊和功能。
如果只需要頂級變量名,這是湯姆·道爾頓(Tom Dalton)答案的一項調整,僅包含頂級變量:
def find_names_of_module(module):
with open(module.__file__) as f:
code = f.read()
tree = ast.parse(code)
assignments = (node for node in tree.body if isinstance(node, ast.Assign))
return {target.id for a in assignments for target in a.targets}
如果您可以更改結構,則可以使用以下解決方案:
base.py
foo = 1
bar = 2
extension.py
baz = 3
qux = 4
擴展名
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]
由於列表內容不可散列,因此不能使用集合來獲取差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.