Omnicompletion Vim не удается с "из" импорта в Python - PullRequest
3 голосов
/ 09 июля 2010

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 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__).

Я снова протестировал свой пример, и я думаю, что проблема не в импорте «from», а в использовании импортированного класса внутри другого класса. Если я изменю файл 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 не удалась, но вторая работает нормально. Так что да, похоже на ошибку в плагине:)

1 Ответ

2 голосов
/ 10 июля 2010

обновление: ооо, поэтому я проверил ваш пример, и я получил завершение для

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>

И ... завершение!Не могли бы вы попробовать этот пример, чтобы посмотреть, работает ли он со встроенными модулями для вас? Если это так, вам, вероятно, следует проверить пути ...

Если он все еще не работает, и вы 'Чтобы покопаться, посмотрите строку # 555 в pythoncomplete.vim [at /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 операторов.

Ура

...