首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python3:使用用户输入获取模块源代码(检查.getsource)

python3:使用用户输入获取模块源代码(检查.getsource)
EN

Stack Overflow用户
提问于 2018-07-16 01:42:04
回答 2查看 312关注 0票数 2

我想做的是..。

我有一个名为'my_library.py'的模块,它包含一些函数或方法。

我有另一个名为'test_library.py'的模块,我想从test_library打印一些特定函数的源代码,这些函数位于"my_library“模块中

我知道我们可以用...

print(inspect.getsource(my_library.add))

print(open(my_library.__file__).read())

在这里,我希望将用户的函数或模块名称作为输入

示例:

代码语言:javascript
复制
    **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似乎还行得通

有没有办法从用户那里获取输入并显示特定的函数或模块?

有什么建议或建议来解决这个问题吗?

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-16 02:13:35

您需要创建一个实际的对象来传递给get_source,例如:

代码语言:javascript
复制
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从字符串生成它们,例如:

代码语言:javascript
复制
for item in dir(my_library):
     if not item.startswith('_'):
         print(item)
         nam = '.'.join(['my_library', item])
         print(inspect.getsource(eval(nam)))

提供:

代码语言:javascript
复制
add
def add(x,y):
        return x+y

substract
def substract(x,y):   return x-y
票数 1
EN

Stack Overflow用户

发布于 2018-07-16 02:20:34

假设我们有一个文件module.py

代码语言:javascript
复制
def test_func(arg1, arg2):
    return arg1 + arg2

我们可以通过获取对function对象的引用来解析此成员,以供getsource()从另一个代码区域使用:

代码语言:javascript
复制
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导入的模块成员

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51350663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档