3

通常のインポートではなく「from」インポートがある場合、PythonのOmnicompletionは失敗するようです。たとえば、次の2つのファイルがある場合:

Test.py:

class Test:
    def method(self):
        pass

main.py:

from Test import Test

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

self.xのオムニコンプリーションをアクティブにしようとすると...「パターンが見つかりません」と表示されます。ただし、インポートステートメントを次のように変更すると、次のようになります。

import Test

およびself.x宣言は次のとおりです。

self.x = Test.Test()

そうすれば、期待どおりにオムニコンプリーションを使用できます(たとえば、「メソッド」を提案します)。

私はVim7.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__)。

例をもう一度テストしましたが、問題は「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>

オムニコンプリーションを使用する最初の試みは失敗しますが、2番目の試みは正常に機能します。そうそう、プラグインのバグのように見えます:)

4

1 に答える 1

2

更新:おお、あなたの例をチェックしたところ、完了しました

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

だがしかし

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

…掘ってみます

更新 2: Dr. Strangelove の復讐

そして...ここが変なところです。

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>

そして…完成!その例を試して、組み込みモジュールで動作するかどうかを確認していただけますか? その場合は、おそらくパスを確認する必要があります...

/usr/share/vim/vim72/autoload/pythoncomplete.vimそれでも機能せず、掘り下げたい場合は、[私のubuntuマシンで] pythoncomplete.vimの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 に答える