python - 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
我试图将该字符串输入转换为对象、文件、类......似乎
没有任何效果有没有办法从用户那里获取输入并显示该特定功能或模块?
有什么解决问题的建议或意见吗?
提前致谢
解决方案
您需要创建一个要传递给的实际对象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
推荐阅读
- php - Laravel 在浏览器中缓存路由
- node.js - 如何使用 express 和 react 设置路线?
- android - Android 清单错误
- java - SpringBoot 单元测试未正确获取 @Component 自动装配对象的 @Value
- r - 用给定某个组的最后一个值覆盖以前的值
- python - pip3 安装失败,没有这样的文件或目录:'/tmp/pip-dvxrqtnr-build/setup.py'
- java - 更新到 io.cucumber 后找不到 Cucumber 步骤定义
- crystal-reports - Crystal Reports 编辑轴标签选项灰显
- ag-grid - 自定义分页组件 ag-grid vue
- javascript - 用 howlerjs 播放声音在 chrome 中 1.99 秒后停止