我想做的是..。
我有一个名为'my_library.py'的模块,它包含一些函数或方法。
我有另一个名为'test_library.py'的模块,我想从test_library打印一些特定函数的源代码,这些函数位于"my_library“模块中
我知道我们可以用...
print(inspect.getsource(my_library.add))
或
print(open(my_library.__file__).read())
在这里,我希望将用户的函数或模块名称作为输入
示例:
**my_library.py**
def add(x,y):
return x+y
def substract(x,y):
return x-y
**test_library.py**
import inspect
import my_library
name = "my_library.substract"
print(inspect.getsource(name))
TypeError: module, class, method, function, traceback, frame, or code object was expected, got str
我尝试过将字符串输入转换成对象、文件、类...nothing似乎还行得通
有没有办法从用户那里获取输入并显示特定的函数或模块?
有什么建议或建议来解决这个问题吗?
提前感谢
发布于 2018-07-16 02:13:35
您需要创建一个实际的对象来传递给get_source
,例如:
In [1]: def add(x,y):
...: return x+y
...:
In [2]: def substract(x,y): return x-y
In [3]: %save my_library.py 1-2
The following commands were written to file `my_library.py`:
def add(x,y):
return x+y
def substract(x,y): return x-y
In [4]: import inspect
In [5]: import my_library
In [6]: obj = my_library.substract
In [7]: inspect.getsource(obj)
Out[7]: 'def substract(x,y): return x-y\n'
In [8]: obj = my_library.add
In [9]: inspect.getsource(obj)
Out[9]: 'def add(x,y):\n return x+y\n'
In [10]:
您可以通过对字符串使用eval
从字符串生成它们,例如:
for item in dir(my_library):
if not item.startswith('_'):
print(item)
nam = '.'.join(['my_library', item])
print(inspect.getsource(eval(nam)))
提供:
add
def add(x,y):
return x+y
substract
def substract(x,y): return x-y
发布于 2018-07-16 02:20:34
假设我们有一个文件module.py
def test_func(arg1, arg2):
return arg1 + arg2
我们可以通过获取对function对象的引用来解析此成员,以供getsource()
从另一个代码区域使用:
import inspect
import sys
import module
def main():
# what the user would input
input_str = 'module.test_func'
# split user input up into individual members
name_list = input_str.split('.')
# extract the starting point name
base_name = name_list[0]
# check to make sure that name exists in the current scope and extract a reference to it
if base_name in locals():
base_obj = locals()[base_name]
elif base_name in globals():
base_obj = globals()[base_name]
else:
print('base name {} is unknown'.format(base_name))
return 1
# iteratively step through the attribute chain
containing_object = base_obj
for name in name_list[1:]:
try:
containing_object = getattr(containing_object, name)
except AttributeError:
print('unable to resolve name {} from object {}'.format(name, containing_object))
return 1
# print out source of final reference
print(inspect.getsource(containing_object))
return 0
if __name__ == '__main__':
sys.exit(main())
还可以对其进行扩展,以检索尚未使用importlib导入的模块成员
https://stackoverflow.com/questions/51350663
复制相似问题