2010-07-09 37 views
3

當有一個「from」導入而不是普通導入時,Omnicompletion for Python似乎失敗。 舉例來說,如果我有這兩個文件:Vim的omnicompletion與Python中的「from」導入失敗

Test.py:

class Test: 
    def method(self): 
     pass 

main.py:

from Test import Test 

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

如果我嘗試激活omnicompletion爲self.x ...它說「模式未找到」。 但是,如果我改變import語句:

import Test 

和self.x聲明:

self.x = Test.Test() 

那麼我就能用omnicompletion預期(它表明 「法」,例如)。

我正在使用Vim 7.2.245和Python代碼完成(pythoncomplete)的默認插件。 我應該設置一些變量嗎?或者是預期這種行爲?

更新

基於Jared的答案,我偶然被發現的東西:

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第一次嘗試失敗,但第二個能正常工作。 所以是的,看起來像在插件:)

+0

所有這一切都是:不,沒有預料到,你沒有做任何錯誤=)這是一個錯誤。看起來像腳本在這裏維護:http://www.vim.org/scripts/script.php?script_id=1542我建議提交一個錯誤報告。 – 2010-07-09 23:23:22

回答

2

更新了一個錯誤:哦,所以我檢查你的榜樣,我也得到了完成

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

但不

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

...我會做一些挖掘

更新2:reve Strangelove博士的nge

和...這是它變得奇怪的地方。

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線#555 [在/usr/share/vim/vim72/autoload/pythoncomplete.vim我的Ubuntu機器上]:

  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語句的地方。

乾杯