3

当存在“来自”导入而不是正常导入时,Python 的 Omnicompletion 似乎失败了。例如,如果我有这两个文件:

测试.py:

class Test:
    def method(self):
        pass

主要.py:

from Test import Test

class Test2:
    def __init__(self):
       self.x = Test()

如果我尝试为 self.x 激活omnicompletion ...它会显示“找不到模式”。但是,如果我将导入语句更改为:

import Test

和 self.x 声明:

self.x = Test.Test()

然后我可以按预期使用omnicompletion(例如,它建议“方法”)。

我正在使用 Vim 7.2.245 和 Python 代码完成的默认插件(pythoncomplete)。我应该设置一些变量吗?或者这种行为是预期的?

更新

根据贾里德的回答,我偶然发现了一些东西:

Omnicompletion 对此不起作用:

from StringIO import StringIO

class Test:
    def __init__(self):
        self.x = StringIO()
        self.x.<C-x><C-o>

s = Test()

但适用于此:

from StringIO import StringIO

class Test:
    def __init__(self):
        self.x = StringIO()
        self.x.<C-x><C-o>

s = Test()
s.x = StringIO()

唯一的区别是 x 的重新声明(实际上,如果我删除里面的声明,它也可以工作__init__)。

我再次测试了我的示例,我认为问题不在于“从”导入,而是在另一个类中使用了导入的类。如果我将文件更改main.py为:

from Test import Test

class Test2:
    def __init__(self):
       self.x = Test()
       self.x.<C-x><C-o>

y = Test()
y.<C-x><C-o>

第一次尝试使用omnicompletion 失败,但第二次工作正常。所以是的,看起来像插件中的一个错误:)

4

1 回答 1

2

更新:哦,所以我检查了你的例子,我完成了

x = Test()
x.<C-x><C-o>

但不是

o = object()
o.x = Test()
o.x.<C-x><C-o>

...我要去挖掘

更新2: 奇爱博士的复仇

而且......这就是它变得奇怪的地方。

from StringIO import StringIO
class M:
    pass
s = M()
s.x = StringIO()
s.x.<C-x><C-o>

完成。但是这个

from StringIO import StringIO
class M: pass
s = M()
s.x = StringIO()
s.x.<C-x><C-o>

你发现区别了吗?语法上什么都没有——只是一个小空格

然而它破坏了完成。所以那里肯定有一个解析错误(为什么他们不只使用ast模块,我不知道......)

[更新结束]

乍一看,我无法重现您的问题;这是我的测试文件:

from os import path
path.<C-x><C-o>

我得到了完成。现在,我知道这不完全是你的情况,但它表明 pythoncomplete 知道'from'。

现在更深入的例子:

from StringIO import StringIO
s = StringIO()
s.<C-x><C-o>

然后……完成!您能否尝试该示例以查看它是否适用于您的内置模块?如果是这种情况,您可能应该检查路径...

如果它仍然不起作用,并且您准备进行一些挖掘,请查看 pythoncomplete.vim [在/usr/share/vim/vim72/autoload/pythoncomplete.vim我的 ubuntu 机器上] 的第 555 行:

            elif token == 'from':                                    
                mod, token = self._parsedotname()                    
                if not mod or token != "import":                     
                    print "from: syntax error..."                    
                    continue                                         
                names = self._parseimportlist()                      
                for name, alias in names:                            
                    loc = "from %s import %s" % (mod,name)           
                    if len(alias) > 0: loc += " as %s" % alias       
                    self.scope.local(loc)                            
                freshscope = False                                   

如您所见,这是它处理from语句的地方。

干杯

于 2010-07-09T23:05:59.467 回答