CPS コードのような高機能関数を書きたいと思います。関数コードを受け取り、それをオブジェクトにカプセル化し、このオブジェクトを結合する手段を追加する必要があります。
このようなもの:
myFunction=MyFunction(
a = b+c
print(c)
return a)
しかし、無名関数の pythonic 式は 1 つだけです - lambda ステートメントです。あまり似合いません。
Python は強力な言語であり、さまざまな式があります: デコレータ、eval など... 前述の例のように無名関数を記述する良い方法はありますか?
もう 1 つの方法は、ラムダ式を、モナドの bind や return などの特別な関数や、複雑な式を 1 行で記述するためのその他の高階関数で拡張することです。
主な目的は、カスタム スロー コントロール式を作成することです。
class TimeoutExpression:
def __init__(self,name,function,timeout):
...
def eval(self):
""" eval functions, print result and error message
if functions failed to calculate in time """
...
def andThen(self,otherExpression):
""" create complex sequential expression"
...
def __call__(self):
...
そして、次のように使用されます。
TimeoutExpression( time consuming calculation ).andThen(
file object access).andThen(
other timer consuming calcualtion )
カスタム制御フロー構造を作成するための最適な Python の慣用的な方法は何ですか?
ディスカッションを読みました: How to make an anonymous function in Python without Christening it? 同じアプローチでいくつかの決定が言及されました: 三重引用符で囲まれた文字列から関数を生成します。絶対に正しく動作する一方で、かなり面倒に思えます。それは今のところ設計された最良のアプローチですか?
更新:
問題はないと言われました.pythonでは、どのコンテキストでもdefを使用できます。私のpythonの経験が私をだまし、提案されているように任意のスコープでdefを使用しようとしたと想定しました。 エラーが発生しました。どのようなコンテキストでも正確にどのように定義を配置する必要がありますか?
def compose(f):
return lambda k: lambda x: f(k(x))
test = compose( def sqr(x) :
print ("sqr "+str(x))
return x*x
return sqr) ( def x2(x):
print("x2 "+str(x))
return x*2
return x2 )
エラー:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "anonFunction.py", line 4
test = compose( def sqr(x) :
^
SyntaxError: invalid syntax