<p><strong>简介</strong></p>
<p>Pydev是一个很棒的eclipse插件,让我们可以轻松地编写python代码。你知道吗</p>
<p>当我这样做时,它甚至可以给出自动完成建议:</p>
<pre><code>from package.module import Random_Class
x = Random_Class()
x. # the autocompletion will be popped up,
# showing every method & attribute inside Random_Class
</code></pre>
<p>太棒了!!!你知道吗</p>
<p><strong>问题(和我的问题)</strong></p>
<p>但是,当我不使用显式导入,例如使用<code>__import__</code>时,我就不能有相同的自动完成效果。你知道吗</p>
<pre><code>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
</code></pre>
<blockquote>
<p><strong>Question:</strong> is there any way (in pydev or any IDE) to make the second one also
show autocompletion?</p>
</blockquote>
<p><strong>我为什么要这么做?</strong></p>
<p>好吧,我创建了一个简单的MVC框架,我想提供一些类似于<code>load_model</code>、<code>load_controller</code>和<code>load_view</code>的东西,它们仍然可以使用自动完成(或者至少可以使用)</p>
<p>因此,不要让用户这样做(尽管我并不禁止他们这样做):</p>
<pre><code>from applications.the_application.models.the_model import The_Model
x = The_Model()
x. # autocompletion works
</code></pre>
<p>我想让用户这样做:</p>
<pre><code>x = load_model('the_application', 'the_model')()
x. # autocompletion still works
</code></pre>
<p>“应用程序”部分实际上是由另一个脚本配置的,我不希望用户每次更改配置时都更改所有导入模型/控制器部分。另外,我认为<code>load_model</code>、<code>load_controller</code>和<code>load_view</code>使MVC模式更加明显。你知道吗</p>
<p><strong>意外的回答</p>
<ol>
<li><p>我知道一些技巧,比如这样做(就像人们用
web2py):</p>
<pre><code>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
</code></pre>
<p>我不希望这样做,因为这只会增加不必要的
额外的工作。</p></li>
<li>我不期待任何<strong><em>不要试图变得聪明</em></strong>的评论。我受够了</li>
<li>我不希望动态导入是邪恶的评论。我不是纯粹主义者。你知道吗</li>
<li>我不希望任何<strong><em>只是使用django,或者pylons,或者任何</em></strong>评论。比如和我的问题无关的评论。你知道吗</li>
</ol>