0

pydev がコード補完に何を使用するかを決定する方法を知っている人はいますか? コード補完を有効にするために、一連のクラスを定義しようとしています。私は__new__set__dict__とを使用しようとしまし__slots__たが、どちらも pydev autocomplete にリストされていないようです。

オートコンプリートにリストしたい列挙型のセットがありますが、クラスごとにすべてをハードコードするのではなく、ジェネレーターに設定したいと思います。

だからというより

class TypeA(object):
    ValOk = 1
    ValSomethingSpecificToThisClassWentWrong = 4
    def __call__(self):
        return 42

次のようなことをしたい

def TYPE_GEN(name, val, enums={}):
    def call(self):
        return val
    dct = {}
    dct["__call__"] = call
    dct['__slots__'] = enums.keys()
    for k, v in enums.items():
        dct[k] = v
    return type(name, (), dct)

TypeA = TYPE_GEN("TypeA",42,{"ValOk":1,"ValSomethingSpecificToThisClassWentWrong":4})

処理を支援するために何ができますか?

編集: コメントは、私がしていることに疑問を呈しているようです。繰り返しますが、私が求めていることの大部分はコード補完です。さまざまなマイクロコントローラーと通信するために、プロトコルへの python バインディングを使用しています。変更できる各パラメーター (数百あります) には概念的に名前がありますが、プロトコル上ではその ID を使用する必要があり、これは事実上ランダムです。パラメータの多くは、概念的に名前が付けられた値を受け入れますが、ここでも整数で表されます。したがって、列挙型。

ライブラリの python モジュールを自動生成しようとしているので、グループはエラーが発生しやすい番号の代わりに名前を使用して変更したいものを指定できます。プロパティはパラメーターの__call__ID を返します。列挙型はパラメーターの許容値です。

はい、各クラスの冗長バージョンを生成できます。ポイントはオートコンプリートであり、これらのクラスを表示しないため、タイプごとに1行がより明確に見えました。

4

3 に答える 3

1

わかりました、指摘したように、あなたのコードはこれには動的すぎます... PyDev はあなた自身のコードを静的に分析するだけです (つまり、あなたのプロジェクト内にあるコード)。

それでも、いくつかの代替手段があります。

オプション1:

PyDev に、ライブラリ内 (つまり、サイト パッケージ内) のコードを動的に分析させることができます。その場合、シェルを介してその情報を動的に取得できます。

これを行うには、サイト パッケージでモジュールを作成する必要があり、インタープリター構成でそれを「強制ビルトイン」に追加する必要があります。詳細については、http: //pydev.org/manual_101_interpreter.htmlを参照してください。

オプション 2:

別のオプションは、それを事前定義された補完に入れることです(ただし、この場合、コードではなく、インタープリター構成にも含める必要があります-とにかく、そこで補完を明示的にする必要があります)。こちらもやり方は上のリンクを参照。

オプション 3:

実際のコードを生成します。Cog ( http://nedbatchelder.com/code/cog/ ) は、Python コードを記述してファイルの内容を出力し、後でコードを変更したり、cog を再実行して内容を更新したりできるため、これに代わる最良の方法であると考えています。が必要です (PyDev のライブラリであるため、コードを配置せずに適切な補完が必要な場合は、それが最良の代替手段であると信じています。また、構造が明示的であるため、自分が持っているものをよりよく把握することができますそこの)。

cog は、Java/C++ などの他の言語を使用している場合にも機能することに注意してください。そのため、この特定の問題に関係なく、ツール セットに追加することをお勧めします。

于 2013-08-15T17:24:04.927 に答える
0

Python の完全に一般的なコード補完は、(対話型の Python シェルとは対照的に) 「オフライン」エディターでは実際には不可能です。

その理由は、Python が動的すぎるためです。基本的に何でもいつでも変更できます。入力TypeA.Valして補完を要求する場合、システムは、TypeAバインドされているオブジェクト、そのクラス、および両方の属性を認識している必要がありました。これらの 3 つの事実はすべて変更される可能性があります (そして変更されます。TypeA未定義で始まり、プログラム実行中の特定の時点でのみオブジェクトにバインドされます)。

したがって、システムはプログラム実行のどの時点から補完が必要かを知る必要がありますか? そして、それを指定する明確な方法があったとしても、実際にその時点までプログラムを実行することなく、その時点でプログラム内のすべての状態がどのようなものであるかを知る一般的な方法はありません. !

したがって、pydev が代わりに行うのは、かなり明白な場合の推測です。fooクラスを定義するモジュールにクラス ブロックがある場合、インポートBar元の名前がそのクラスを参照することは間違いありません。これで、 の下、または によって作成されたオブジェクトでアクセスできる名前について、ある程度のことがわかります。確かに、プログラム実行時に再バインド(またはその属性のセットを変更) したり、他のファイルをヒットする環境で実行したりすることができます。しかし、そのようなことはめったに起こらず、一般的なケースでは補完が役に立ちます。BarfooBar.obj = Bar()foo.Barimport foo

ただし、これが意味することは、Python の動的言語の柔軟性を「使いすぎる」と、基本的に補完が失われるということです。関数を呼び出してクラスを定義するのも、その 1 つです。TypeA名前ValOkValSomethingSpecificToThisClassWentWrong;があると推測する準備ができていません。結局のところ、 への呼び出しの結果として生成されるオブジェクトは他にもたくさんあると思われますがTYPE_GEN、それらはすべて異なる名前を持っています。

したがって、主な目標が補完を実現することである場合は、pydev を簡単にして、これらのクラスを完全に書き出す必要があると思います。もちろん、必要に応じて、同様のコードを使用して Python ファイルを (テキストで) 生成することもできます。ただし、これらをクラスとして定義するよりも辞書で定義するほうが、実際には「構文上のオーバーヘッド」が多いようです。"a": b,ではなくアイテムごとに書いていますa = b。これらをより体系的に生成したり、既存の定義ファイルなどを解析したりできない限り、静的クラス定義は辞書の運転よりも読み書きが簡単だ思いますTYPE_GEN

于 2013-08-12T22:47:35.113 に答える