在函数内的文件级导入? (Python 2)

时间:2013-06-11 08:04:50

标签: python import

是否可以做这样的事情?

def loadModules():
  import time
  from myModule import *

def runFunction():
  try:
    print str(time.time())
    print myFunction() # myFunction is in myModule (myModule.myFunction)
  except NameError:
    raise RuntimeError("Module was not initialized. Call loadModules() first.")

if (__name__ == "__main__"):
  # this should fail
  try:
    runFunction()
  except RuntimeError:
    print "Exception raised as expected."

  loadModules()

  runFunction() # it should work now

这不会按预期工作,因为导入里面的模块 loadModules函数不会在文件级别声明它们。

对于像time这样的模块,我可以在导入后添加global time语句。但是,如果导入的项目未知,如何在from myModule import *中完成此操作?我不会自动知道myModule中每个函数的名称。即使我这样做,那也是一个丑陋的全球声明。

基本上,我可以基本上采用所有局部变量并使它们成为全局变量吗?

编辑:这似乎适用于测试代码:

def test():
    import time
    global time
    print "Inside test function: %s" % str(time.time())

test()
print "outside function: %s" % str(time.time())

这也有效:

def test():
    from time import time
    global time
    print "Inside test function: %s" % str(time())

test()
print "outside function: %s" % str(time())

然而这不起作用:

def test():
    import time
    print "Inside test function: %s" % str(time.time())

test()
print "outside function: %s" % str(time.time())

1 个答案:

答案 0 :(得分:3)

这是一个可怕的想法,即使它能够发挥作用,它也无法实现。

导入后放置global语句将完全没有效果。唯一要做的就是将该名称标记为当前范围内的全局 。函数返回后,调用者仍然不知道导入的名称。

无论如何,你无论如何都不应该使用from MyModule import *