返回列出的导入的Python函数给出了空结果,但是逐行工作

时间:2016-06-13 20:28:39

标签: python global python-3.4 python-module

调整代码

How to list imported modules?

看起来像

def imports():
    import types

    Module = None
    Modules = list()

    for name, val in globals().items():
        if isinstance(val, types.ModuleType):
            Module = val.__name__
            Modules.append(Module)

    return Modules

并保存为imports.py。打算以表格

激活
Modules = imports.imports()

而是返回一个空列表Modules

看过这里

Python.org classes + generators

这里

Python.org Data structures: list comprehensions

在这里

Python return list from function

并没有得到它。

当我逐行运行函数体时,我得到了所需的结果(存储在Modules中的导入模块的列表)。当它作为定义的函数运行时,它会给出一个空列表。为什么我的返回列表变量为空?我也试过yield同样的结果。

1 个答案:

答案 0 :(得分:3)

globals() function返回中使用的模块的全局命名空间。您正在查看在imports模块中导入的模块,并且有0个此类导入。如果要访问调用函数的代码的全局变量,则不能使用此函数。

您必须使用调用框架的全局变量;在CPython中,您可以使用sys._getframe() function执行此操作,该vars() function返回一个框架对象;该帧的f_globals属性是函数调用者的全局命名空间:

caller_frame = sys._getframe(1)
for name, val in caller_frame.f_globals.items():

或者,让调用者传入命名空间;这样你就可以列出任何模块中使用的模块:

def imports(namespace=None):
    import types, sys

    if namespace is None:
        # default: caller globals
        namespace = sys._getframe(1).f_globals

    modules = []

    for name, val in namespace.items():
        if isinstance(val, types.ModuleType):
            module_name = val.__name__
            modules.append(module_name)

    return modules

如果您调用不带参数的函数,则上述版本仍使用sys._getframe(1)。但你现在可以在任何字典上使用它了:

import string
print(imports(vars(string)))

例如,这使用Angular.injector来获取string模块的命名空间字典。这会产生:

>>> import string
>>> imports(vars(string))
['re', '_string']