首页 > 解决方案 > python3:使用用户输入获取模块源代码(检查.getsource)

问题描述

我想做什么...
我有一个名为“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
我试图将该字符串输入转换为对象、文件、类......似乎
没有任何效果有没有办法从用户那里获取输入并显示该特定功能或模块?
有什么解决问题的建议或意见吗?

提前致谢

标签: pythonpython-3.x

解决方案


您需要创建一个要传递给的实际对象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

推荐阅读