将new.module()移植到Python3

2 投票
1 回答
1287 浏览
提问于 2025-04-19 04:36

我该如何在Python3中实现这个呢:

def import_code(code, name, add_to_sys_modules=False):
    module = new.module(name)
    sys.modules[name] = module
    do_bookkeeping(module)
    exec(code in module.__dict__)

    return module

看起来无论是 __import__ 还是 importlib 都并没有真正 返回 可以用来做记录的模块。

1 个回答

4

在Python 3中,new模块已经被移除了。你可以在Python 2和3中使用types.ModuleType来代替。

你的exec()调用写错了,应该是:

exec(code, module.__dict__)

你现在试图执行的是code in module.__dict__这个表达式返回的False结果。其实在Python 2中,exec()作为一个函数也是可以用的,所以下面的写法在主要版本中都是有效的:

import types

def import_code(code, name, add_to_sys_modules=False):
    module = types.ModuleType(name)
    if add_to_sys_modules:
        sys.modules[name] = module
    do_bookkeeping(module)
    exec(code, module.__dict__)
    return module

撰写回答