有没有办法让pydev(或者任何pythonide)理解通过使用import或ex导入的模块

2024-06-25 23:28:04 发布

您现在位置:Python中文网/ 问答频道 /正文

简介

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_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,或者pylons,或者任何评论。比如和我的问题无关的评论。你知道吗

Tags: the用户fromimportpackagemodelmy评论
2条回答

不是我自己问题的答案。不过,我可以改变方法。因此,我可以使用相对导入,而不是提供“load\u model()”。像这样:

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

我以前做过。这可能与您预期的方法略有不同,因此如果不适用请告诉我。你知道吗

我使用与您的示例类似的代码,动态地导入不同的模块,这些模块都是主类的子类。因为子类化模块已经导入了主模块,所以我不需要在主模块中导入它。你知道吗

为了突出显示,解决方案是首先将主类导入主模块,即使它没有直接使用。在我的例子中,如果特定的子类不存在,这是一个很好的回退,但这是一个实现细节。你知道吗

只有当所有类都继承自一个父类时,这才有效。你知道吗

相关问题 更多 >