如何在将模块名指定为函数参数的函数中创建(全局)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
的看法是正确的。对我来说,我正在一段更大的代码中使用它,该代码使用一系列代码构建模块对象。