从
调整代码看起来像
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
同样的结果。
答案 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']