是否有任何方法可以使PYDEV(或任何Python IDE)理解使用__import__或exec导入的模块



简介

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_modelload_controllerload_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_modelload_controllerload_view使MVC模式显示更明显。

意外答案

  1. 我知道这样做的一些技巧(就像人们所做的那样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
    

    我不希望这样做,因为它只会添加不必要的额外的工作。

  2. 我不希望任何不要试图成为聪明的注释。我有足够的他们
  3. 我不希望动态导入是邪恶的注释。我不是纯粹主义者。
  4. 我不希望任何只需使用django,塔架或任何注释。例如评论甚至与我的问题无关。

我以前做过。这可能与您的预期方法略有不同,所以让我知道它是否不适用。

i使用与示例相似的代码,动态导入所有子类的不同模块。因为子分类模块已经导入主机,所以我不需要在主模块中导入它。

要突出显示,解决方案是首先将主类导入主模块,即使没有直接使用。在我的情况下,如果特定子类不存在,那是一个很好的后备,但这是实现细节。

这仅在您的课程全部从一个父母那里继承时才能起作用。

并不是我自己问题的答案。但是,我可以改变方法。因此,我可以使用相对导入,而不是提供" load_model()"。这样的东西:

from ..models.my_model import Model_Class as Great_Model
m = Great_Model()

最新更新