如何匹配globbing行为来创建没有exec的命名空间?

2024-04-24 03:03:46 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我们正在构建一个名称空间,那么如何将模块内容以与导入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')

Tags: 模块方法import名称modcontents空间load