cPython >= 3.0 では、インポートされたモジュールを介して言語にステートメントを追加することは可能ですか? case/switch ステートメントを実装したいとします。それをモジュールとして記述できますか、それともPEP 306に従って cPython ソース ファイルを編集し、言語全体を再コンパイルする必要がありますか?
4 に答える
新しい言語構造を標準の Python に変換できると仮定すると、はい、技術的にはimport hooksを使用して変換できます。基本的に、ファイルを読み取り、言語構造を有効な Python に置き換え (完全なパーサーが必要になる可能性があるタスク)、生成された Python ソースをコンパイルし、モジュール オブジェクトを返す必要があります。気弱な人向けではありませんが、技術的には実現可能です。
if/elif のはしごを使用して切り替えを行います。言語と戦わないでください。それがうまくいくことを学び、それらのことをしてください:
if x == 1:
do_1()
elif x == 2:
do_2()
elif x == 17:
do_17()
else:
something_else()
ステートメントを追加することは大きな労力であり、それらを適切に設計することはさらに困難です。switch ステートメントに関する議論が python-ideas メーリング リストで行われています。それらを読んで、関連する問題の感覚をつかんでください。
試してはいけません。ソースを編集して再コンパイルする必要があります。
代わりに、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")
いいえ、ステートメントを追加することはできません。関数、クラス、および/またはオブジェクトを使用して回避策を見つける必要があります。
スイッチ/ケースの場合: いくつかの方法で実行できます。
たとえば、単なる 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)