我想编写一种CPS代码高级功能。他们应该采用功能代码,将其封装在对象中,并添加用于组合该对象的方法。

像这样:

myFunction=MyFunction(
  a = b+c
  print(c)
  return a)


但是匿名函数只有一个pythonic表达式-lambda语句。它不太适合。

Python是一种功能强大的语言,它具有不同的表达方式:装饰器,eval等。是否有编写上述示例中所述的匿名函数的好方法?

另一种方法是使用特殊功能扩展lambda表达式,例如monadic bind和return,以及其他用于单行编写复杂表达式的高阶函数。

主要目的是创建自定义的抛出控制表达式。

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放在任何上下文中?

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

最佳答案

使用lambda的w.r.t Python没有任何优势。 Lambda和Anonymous函数通常用于简单函数,如果需要更复杂的多行函数,则编写命名函数的可读性更高。

由于Function是一流的对象,因此您可以简单地定义它,将其分配给变量,使用它并传递它。
除非您另外需要一个简单的函数以选择lambda函数,否则命名函数是有利的。尽管如此,在从未有过的Python语言中也使用了lambda。

回到你的例子,

myFunction=MyFunction(
  a = b+c
  print(c)
  return a)


在Python中,其编写方式与

def MyFunction:
    a =b + c
    print c
    return a


然后将其作为MyFunction传递给您的代码是相当Python风格的。我已经在Javascript中看到了将回调写为匿名的代码。但是每种语言都有自己的哲学,Python的哲学是可读性。

---可读性很重要。

关于python - 更多功能的python,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10235074/

10-09 06:46
查看更多