2

cPython >= 3.0 では、インポートされたモジュールを介して言語にステートメントを追加することは可能ですか? case/switch ステートメントを実装したいとします。それをモジュールとして記述できますか、それともPEP 306に従って cPython ソース ファイルを編集し、言語全体を再コンパイルする必要がありますか?

4

4 に答える 4

4

新しい言語構造を標準の Python に変換できると仮定すると、はい、技術的にはimport hooksを使用して変換できます。基本的に、ファイルを読み取り、言語構造を有効な Python に置き換え (完全なパーサーが必要になる可能性があるタスク)、生成された Python ソースをコンパイルし、モジュール オブジェクトを返す必要があります。気弱な人向けではありませんが、技術的には実現可能です。

于 2012-06-29T22:28:22.097 に答える
3

if/elif のはしごを使用して切り替えを行います。言語と戦わないでください。それがうまくいくことを学び、それらのことをしてください:

if x == 1:
    do_1()
elif x == 2:
    do_2()
elif x == 17:
    do_17()
else:
    something_else()

ステートメントを追加することは大きな労力であり、それらを適切に設計することはさらに困難です。switch ステートメントに関する議論が python-ideas メーリング リストで行われています。それらを読んで、関連する問題の感覚をつかんでください。

于 2012-06-30T00:39:55.263 に答える
2

試してはいけません。ソースを編集して再コンパイルする必要があります。

代わりに、switch ステートメントが必要な理由を自問し、それが必要ないことを認識してください。

def firstfunction(x):
    print(x)

def secondfunction(x):
    print(x + 15)

def thirdfunction(x):
    print(x / 15.0)

choices = {
    '5': firstfunction,
    5: secondfunction,
    30: thirdfunction,
}

if x in choices:
    choices[x](x)
else:
    print("default case")
于 2012-06-29T22:02:07.600 に答える
0

いいえ、ステートメントを追加することはできません。関数、クラス、および/またはオブジェクトを使用して回避策を見つける必要があります。

スイッチ/ケースの場合: いくつかの方法で実行できます。

たとえば、単なる dict の場合:

def process(a):
    d = {3: lambda: func1(1, 2, 3),
         4: lambda: func2(3, 2, 1),
        }
    call = d.get(a, lambda: elsepart(a))
    return call(a)
于 2012-06-29T22:02:33.980 に答える