在父类basehandler.py
中,有几个导入语句、一个常量和一个类:
import os
import sys
import cgi
import json
JINJA_ENVIRONMENT = jinja2.Environment(foobar)
class BaseHandler(webapp2.RequestHandler):
pass
另一个模块,main.py
,然后用from basehandler import *
导入这个父模块
如果我们使用from basehandler import BaseHandler
或import basehandler
来避免from foo import *
语句,那么就不会收到父类导入的模块,程序会抛出异常。
如何在仍然正确导入父模块及其导入的模块的同时避免from foo import *
?
发布于 2014-03-24 07:26:37
然后没有收到父类导入的模块,程序抛出异常。
如果您的程序使用一个模块,那么您应该在模块本身中导入它,而不是在其他模块中导入它,例如,在您的程序中使用import os
,而不是在from foo import *
中使用foo
模块导入os
。
要回答标题中的问题:使从另一个模块导入的所有模块都可以使用,而不需要外卡导入:
import inspect
import foo # your other module
# get all modules from `foo` and make the names available
globals().update(inspect.getmembers(foo, inspect.ismodule)) #XXX don't do it
就像from foo import *
只导入模块一样。同样的警告外卡进口也适用于此。
发布于 2014-03-20 16:08:13
在引用this answer时,可以在basehandler.py
中定义一个函数,生成所有导入的模块:
import os,sys,cgi,json
import types
def get_imports():
for name, val in globals().items():
if isinstance(val, types.ModuleType):
yield val.__name__
然后,...and在main.py
中导入该函数,并使用exec导入相关模块:
from basehandler import BaseHandler, get_imports
for i in get_imports():
exec "import %s" % i
print os.getcwd() #this will work
不过,这是一种很糟糕的做法,难道您不只是重新导入main.py
中的模块列表有什么特别的原因吗?
发布于 2014-03-20 16:45:42
我说这里还有其他错误--从其他地方导入您的“else处理程序”模块应该只起作用:它需要的名称、模块、类和对象绑定到自己的命名空间,并且存在于该模块中定义的任何代码的globals
字典中--不管您是用from basehandler import BaseHandler
语句获得它的。
请把你的全部回溯贴出来,这样人们就可以知道那里到底发生了什么。
https://stackoverflow.com/questions/22538388
复制相似问题