如何在将模块名指定为函数参数的函数中创建(全局)Python模块?

如何在将模块名指定为函数参数的函数中创建(全局)Python模块?,python,function,module,global,Python,Function,Module,Global,我想在函数中创建一个全局模块对象,并将模块名指定为函数的参数。我已尝试通过以下方式进行此操作: import imp def function1(moduleLocalName): exec("global " + moduleLocalName) moduleString = "bar = 3" exec(moduleLocalName + " = imp.new_module(\"" + moduleLocalName + "\")") exec modul

我想在函数中创建一个全局模块对象,并将模块名指定为函数的参数。我已尝试通过以下方式进行此操作:

import imp

def function1(moduleLocalName):
    exec("global " + moduleLocalName)
    moduleString = "bar = 3"
    exec(moduleLocalName + " = imp.new_module(\"" + moduleLocalName + "\")")
    exec moduleString in globals()[moduleLocalName].__dict__

function1("foo")
print(foo.bar)
模块似乎已在函数范围内成功创建,但在函数范围外不可用。注意,我不想简单地从函数返回模块对象,将其设置为现有的全局对象;我想在函数中创建全局模块对象。我怎样才能做到这一点?

最好:

import sys, types

def function1(moduleLocalName):
    m = types.ModuleType(moduleLocalName)
    setattr(m, 'bar', 3)
    sys.modules[moduleLocalName] = m
    return m

foo = function1('foo')
任何其他模块现在都可以
导入foo
,因为我们已经将它插入了
sys.modules

关键教训:不要使用
exec
。你真的不需要它。如果你认为你需要它,你可能错了。

最好:

import sys, types

def function1(moduleLocalName):
    m = types.ModuleType(moduleLocalName)
    setattr(m, 'bar', 3)
    sys.modules[moduleLocalName] = m
    return m

foo = function1('foo')
任何其他模块现在都可以
导入foo
,因为我们已经将它插入了
sys.modules

关键教训:不要使用
exec
。你真的不需要它。如果你认为你需要它,你可能错了。

最好:

import sys, types

def function1(moduleLocalName):
    m = types.ModuleType(moduleLocalName)
    setattr(m, 'bar', 3)
    sys.modules[moduleLocalName] = m
    return m

foo = function1('foo')
任何其他模块现在都可以
导入foo
,因为我们已经将它插入了
sys.modules

关键教训:不要使用
exec
。你真的不需要它。如果你认为你需要它,你可能错了。

最好:

import sys, types

def function1(moduleLocalName):
    m = types.ModuleType(moduleLocalName)
    setattr(m, 'bar', 3)
    sys.modules[moduleLocalName] = m
    return m

foo = function1('foo')
任何其他模块现在都可以
导入foo
,因为我们已经将它插入了
sys.modules


关键教训:不要使用
exec
。你真的不需要它。如果您认为您需要它,您可能是错的。

非常感谢您在这方面的见解。这并不完全是我想要的,但这是一个合理的方法。在这个特定的案例中,您关于
exec
的看法是正确的。对我来说,我正在一段更大的代码中使用它,该代码使用一系列代码构建模块对象。非常感谢您在这方面的见解。这并不完全是我想要的,但这是一个合理的方法。在这个特定的案例中,您关于
exec
的看法是正确的。对我来说,我正在一段更大的代码中使用它,该代码使用一系列代码构建模块对象。非常感谢您在这方面的见解。这并不完全是我想要的,但这是一个合理的方法。在这个特定的案例中,您关于
exec
的看法是正确的。对我来说,我正在一段更大的代码中使用它,该代码使用一系列代码构建模块对象。非常感谢您在这方面的见解。这并不完全是我想要的,但这是一个合理的方法。在这个特定的案例中,您关于
exec
的看法是正确的。对我来说,我正在一段更大的代码中使用它,该代码使用一系列代码构建模块对象。