简介
pydev是一个很好的日食插件,让我们轻松编写Python代码。
当我这样做时,它甚至可以给出自动完成建议:
from package.module import Random_Class
x = Random_Class()
x. # the autocompletion will be popped up,
# showing every method & attribute inside Random_Class
那太好了!!!
问题(和我的问题)
但是,当我不使用明确导入并使用__import__
时,我不能具有相同的自动完成效果。
import_location = ".".join(('package', 'module'))
__import__(import_location, globals(), locals(), ['*'])
My_Class = getattr(sys.modules[import_location], 'Random_Class')
x = My_Class()
x. # I expect autocompletion, but nothing happened
问题:是否有任何方法(在Pydev或任何IDE中)也使第二个 显示自动完成?
为什么我需要这样做?
好吧,我做了一个简单的MVC框架,我想提供诸如load_model
,load_controller
和load_view
之类的东西,它仍然可以使用自动完成(或至少可以工作)
因此,代替用户这样做(尽管我不允许他们这样做):
from applications.the_application.models.the_model import The_Model
x = The_Model()
x. # autocompletion works
我想让用户这样做:
x = load_model('the_application', 'the_model')()
x. # autocompletion still works
"应用程序"部分实际上是由另一个脚本配置的,我不希望用户每次更改配置时都会更改其所有导入模型/控制器部分。另外,我认为load_model
,load_controller
和load_view
使MVC模式显示更明显。
意外答案
我知道这样做的一些技巧(就像人们所做的那样web2py):
import_location = ".".join(('package', 'module')) __import__(import_location, globals(), locals(), ['*']) My_Class = getattr(sys.modules[import_location], 'Random_Class') x = My_Class() if 0: from package.module import Random_Class x = Random_Class() x. # Now autocompletion is going to work
我不希望这样做,因为它只会添加不必要的额外的工作。
- 我不希望任何不要试图成为聪明的注释。我有足够的他们
- 我不希望动态导入是邪恶的注释。我不是纯粹主义者。
- 我不希望任何只需使用django,塔架或任何注释。例如评论甚至与我的问题无关。
我以前做过。这可能与您的预期方法略有不同,所以让我知道它是否不适用。
i使用与示例相似的代码,动态导入所有子类的不同模块。因为子分类模块已经导入主机,所以我不需要在主模块中导入它。
要突出显示,解决方案是首先将主类导入主模块,即使没有直接使用。在我的情况下,如果特定子类不存在,那是一个很好的后备,但这是实现细节。
这仅在您的课程全部从一个父母那里继承时才能起作用。
并不是我自己问题的答案。但是,我可以改变方法。因此,我可以使用相对导入,而不是提供" load_model()"。这样的东西:
from ..models.my_model import Model_Class as Great_Model
m = Great_Model()