假设我有一个包含一些代码的模块,我想找到这个模块的导入库。
import os
import pandas as pd
import numpy as np
from os.path import basename, join
def export(df, folder):
"""some export thing (not really important)"""
f = join(folder, "test.csv")
df.to_csv(f)
return f
所以这只是一个虚拟的例子。在这个问题的上下文中,这些方法的作用并不重要
从上一个问题开始,我能够获取导入模块的导入语句,但没有意识到from foo import bar
不会显示。
[(x, y.__name__) for x,y in inspect.getmembers(sys.modules[__name__], inspect.ismodule)]
这将返回一个元组:
[('inspect', 'inspect'), ('np', 'numpy'), ('os', 'os'), ('pd', 'pandas'), ('sys', 'sys')]
然后我可以获取该列表,如果元组位置0!=位置1,则它是import foo as f
情况。缺少的是from os.path impor basename, join
和from os import path
的情况。如何包含此类导入?
由于
答案 0 :(得分:1)
您需要创建一个接受模块和功能的自定义谓词函数。在这种情况下,您也可以获得所有功能的名称,然后根据您的需要过滤成员,您就可以获得所需的结果。
def get_members(module):
predicate = lambda x: inspect.ismodule or inspect.function
for x,y in inspect.getmembers(module, predicate):
try:
md = y.__module__
if md != "__main__":
yield (x, y.__name__, y.__module__)
except:
if inspect.ismodule(y):
yield (x, y.__name__)
演示:
# test.py
import os
import pandas as pd
import numpy as np
from os.path import basename, join
from itertools import product
import inspect
import sys
def export(df, folder):
"""some export thing (not really important)"""
f = join(folder, "test.csv")
df.to_csv(f)
return f
def get_members(module):
predicate = lambda x: inspect.ismodule or inspect.function
for x,y in inspect.getmembers(module, predicate):
try:
md = y.__module__
if md != "__main__":
yield (x, y.__name__, y.__module__)
except:
if inspect.ismodule(y):
yield (x, y.__name__)
print(list(get_members(sys.modules[__name__])))
输出:
~/Desktop$ python3 test.py
[('__builtins__', 'builtins'), ('basename', 'basename', 'posixpath'), ('inspect', 'inspect'), ('join', 'join', 'posixpath'), ('np', 'numpy'), ('os', 'os'), ('pd', 'pandas'), ('product', 'product', 'itertools'), ('sys', 'sys')]