简介
Pydev是一个很棒的eclipse插件,让我们可以轻松地编写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
Question: is there any way (in pydev or any IDE) to make the second one also show autocompletion?
我为什么要这么做?
好吧,我创建了一个简单的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
我不希望这样做,因为这只会增加不必要的 额外的工作。
不是我自己问题的答案。不过,我可以改变方法。因此,我可以使用相对导入,而不是提供“load\u model()”。像这样:
我以前做过。这可能与您预期的方法略有不同,因此如果不适用请告诉我。你知道吗
我使用与您的示例类似的代码,动态地导入不同的模块,这些模块都是主类的子类。因为子类化模块已经导入了主模块,所以我不需要在主模块中导入它。你知道吗
为了突出显示,解决方案是首先将主类导入主模块,即使它没有直接使用。在我的例子中,如果特定的子类不存在,这是一个很好的回退,但这是一个实现细节。你知道吗
只有当所有类都继承自一个父类时,这才有效。你知道吗
相关问题 更多 >
编程相关推荐