如果我们正在构建一个名称空间,那么如何将模块内容以与导入globbing匹配的方式加载到名称空间中
一种方法是使用exec,但是这会带来解析&;执行字符串,而且exec
通常值得避免,因为它可能会对安全性产生影响
ns = {}
exec('from math import *', ns, ns)
另一种方法是直接加载变量:
ns = {}
mod = __import__('math')
ns.update(vars(mod))
但是,这会为模块内部操作(如__package__
)加载变量
有没有一种方法可以在不使用exec的情况下加载模块,或者我需要自己编写以下代码:
例如:
def load_module_contents_into_namespace(ns, module_name)
mod = __import__(module_name)
attrs = getattr(mod, '__all__', None)
if attrs is None:
attrs = ([attr for attr in dir(mod) if not attr.startswith('_')])
ns.update({k: getattr(mod, attr) for attr in attrs})
ns = {}
load_module_contents_into_namespace(ns, 'math')
目前没有回答
相关问题 更多 >
编程相关推荐