python中匿名函数的配方?

2024-09-27 07:18:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找最好的recipie,以允许函数的内联定义,或者多行lambda,在python中。在

例如,我想做以下事情:

def callfunc(func):
   func("Hello")

>>> callfunc(define('x', '''
...     print x, "World!"
... '''))
Hello World!

我在this answer中找到了一个define函数的示例:

^{pr2}$

这是一种可能的解决办法,但并不理想。理想的特性是:

  • 在缩进方面要更聪明
  • 更好地隐藏内部(例如,在函数的作用域中不要有anonfunc
  • 提供对周围范围/捕获中的变量的访问
  • 更好的错误处理

还有一些我没想到的事情。我有一个非常好的实现曾经完成了以上大部分,但我不幸失败了。我想知道是否有人做了类似的事情。在

免责声明:

我很清楚这在Python用户中是有争议的,并且被认为是一种黑客行为或不符语法的行为。我还知道在python开发人员邮件列表中讨论了多行lambda,并且故意省略了一个类似的特性。然而,从相同的讨论中,我了解到许多其他人也对这种函数感兴趣。在

我不是在问这是不是一个好主意,而是:考虑到一个人已经决定实现这个,(要么是出于乐趣和好奇心,要么是发疯,真的认为这是一个好主意,要么被枪口指着)如何使匿名define尽可能接近使用python的def(2.7或3.x)现有设施?

示例:

关于原因,这对于gui中的回调非常方便:

# gtk example:
self.ntimes = 0
button.connect('clicked', define('*a', '''
    self.ntimes += 1
    label.set_text("Button has been clicked %d times" % self.ntimes)
''')

使用def定义函数的好处是代码的顺序更符合逻辑。这是来自Twisted应用程序的简化代码:

# twisted example:
def sayHello(self):
    d = self.callRemote(HelloCommand)
    def handle_response(response):
        # do something, this happens after (x)!
        pass
    d.addCallback(handle_response) # (x)

注意它看起来有多乱。为了保持代码顺序==执行顺序,我通常会将类似这样的东西分解:

def sayHello_d(self):
    d = self.callRemote(HelloCommand)
    d.addCallback(self._sayHello_2)
    return d

def _sayHello_2(self, response):
    # handle response
    pass

这更好。命令,但更详细。现在,使用匿名函数技巧:

d = self.callRemote(HelloCommand)
d.addCallback(define('response', '''
    print "callback"
    print "got response from", response["name"]
'''))

Tags: 函数代码self顺序responsedef事情sayhello
1条回答
网友
1楼 · 发布于 2024-09-27 07:18:57

如果您来自javascript或ruby背景,那么python处理匿名函数的能力似乎确实有限,但这是有原因的。Python设计者认为代码的清晰性比简洁性更重要。如果你不喜欢,你可能根本就不喜欢python。这没什么错,还有很多其他的选择——为什么不尝试一种更适合你的语言呢?在

将代码块放入字符串中并动态地解释它们绝对是“扩展”语言的错误方法,只是因为您正在使用的工具(从语法高亮显示工具到python解释器本身)都无法以合理的方式处理“字符串化”的代码。在

回答问题:你所做的基本上是试图构建一些比python更好的编程语言,并在运行中编译成python。这个想法在脚本语言世界中并不新鲜,而且可能是有成效的(CoffeeScript就是一个成功实现的例子),但是你的方法是错误的。format()不是您在处理代码时要寻找的工具。如果您正在编写编译器,请正确地执行:使用解析器(例如pyparsing)在AST中读取代码,遍历AST生成python代码(甚至字节码),在执行过程中捕捉语法错误,并采取措施提供更好的运行时反馈(例如错误上下文、行号等)。最后,确保编译器可以跨不同的python版本和实现工作。在

或者只使用ruby。在

相关问题 更多 >

    热门问题