2010-07-09 3 views
3

L'omni-complétion pour Python semble échouer lorsqu'il y a une importation "de" au lieu d'une importation normale. Par exemple, si j'ai ces deux fichiers:L'omnidirection omniprésente de Vim échoue avec les importations "de" en Python

test.py:

class Test: 
    def method(self): 
     pass 

main.py:

from Test import Test 

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

Si je tente d'activer omnicompletion pour self.x ... il est dit "Motif non trouvé". Cependant, si je change la déclaration d'importation:

import Test 

et la déclaration de self.x à:

self.x = Test.Test() 

alors je suis en mesure d'utiliser omnicompletion comme prévu (il suggère "méthode", par exemple). J'utilise Vim 7.2.245 et le plugin par défaut pour l'achèvement de code Python (pythoncomplete). Dois-je définir une variable? Ou ce comportement est-il attendu?

Mise à jour:

Sur la base de la réponse de Jared, j'ai découvert quelque chose par hasard:

Omnicompletion ne fonctionne pas sur ce point:

from StringIO import StringIO 

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

s = Test() 

Mais fonctionne sur ce point:

from StringIO import StringIO 

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

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

La seule différence est la redeclaration de x (en fait, cela fonctionne également si je supprime la déclaration à l'intérieur __init__).

J'ai encore testé mon exemple, et je pense que le problème n'est pas l'importation "de", mais l'utilisation de la classe importée dans une autre classe. Si je change le fichier 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> 

La première tentative d'utilisation omnicompletion échoue, mais le second fonctionne très bien. Alors yep, ressemble à un bug dans le plugin :)

+0

Tout cela revient à dire: non, ce n'est pas prévu, et vous ne faites rien de mal =) il y a un bug. On dirait que le script est maintenu ici: http://www.vim.org/scripts/script.php?script_id=1542 Je suggère de déposer un rapport de bogue. –

Répondre

2

mise à jour: ooh, donc je vérifié votre exemple, et je reçois l'achèvement pour

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

mais pas

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

... Je vais faire un peu de creusage

mise à jour 2:reve nge de Dr. Strangelove

et ... c'est là que ça devient bizarre.

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

complète. mais cela

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

Avez-vous attrapé la différence? rien syntaxiquement - juste un petit espace

Et pourtant, il casse l'achèvement. Donc, il y a certainement un bug d'analyse là-dedans quelque part (pourquoi ils ne se contentent pas d'utiliser le module ast, je ne sais pas ...)

[fin des mises à jour]

À première vue, Je ne peux pas reproduire votre problème voici mon fichier de test:

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

et j'obtiens achèvement. Maintenant, je sais que ce n'est pas exactement votre situation, mais cela montre que pythoncomplete connaît le 'from'.

Et maintenant plus en profondeur par exemple:

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

Et ... la fin! Pourriez-vous essayer cet exemple à voir si cela fonctionne avec des modules intégrés pour vous? Si tel est le cas, vous devriez probablement vérifier les chemins ...

Si elle ne fonctionne toujours pas, et vous êtes pour un certain fouiller, consultez la ligne # 555 de pythoncomplete.vim [à /usr/share/vim/vim72/autoload/pythoncomplete.vim sur ma machine 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         

comme vous pouvez le voir, c'est où il gère from déclarations.

Vive

Questions connexes