Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中匿名函数的配方?_Python_Anonymous Function - Fatal编程技术网

python中匿名函数的配方?

python中匿名函数的配方?,python,anonymous-function,Python,Anonymous Function,我正在寻找在python中允许内联定义函数或多行lambda的最佳方法 例如,我想做以下工作: def callfunc(func): func("Hello") >>> callfunc(define('x', ''' ... print x, "World!" ... ''')) Hello World! 我在以下内容中找到了define函数的示例: 这是一个可能的解决方案,但并不理想。可取的特点是: 在缩进方面要更聪明 更好地隐藏内部(例如,函数范围内

我正在寻找在python中允许内联定义函数或多行lambda的最佳方法

例如,我想做以下工作:

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

>>> callfunc(define('x', '''
...     print x, "World!"
... '''))
Hello World!
我在以下内容中找到了
define
函数的示例:

这是一个可能的解决方案,但并不理想。可取的特点是:

  • 在缩进方面要更聪明
  • 更好地隐藏内部(例如,函数范围内没有
    anonfunc
  • 提供对周围范围/捕获中变量的访问
  • 更好的错误处理
还有一些我没想到的事情。我曾经有过一个非常好的实现,它完成了上面的大部分工作,但不幸的是我失败了。我想知道是否有人做过类似的事情

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

我不是问这是不是一个好主意,而是问:考虑到一个人已经决定实施这一想法(或者出于好玩、好奇、疯狂、真诚地认为这是一个好主意,或者被枪指着)如何使用python(2.7或3.x)的当前功能使匿名
定义
尽可能接近
def

示例: 关于原因,这对于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
这是更好的wrt。排序,但更详细。现在,使用匿名函数技巧:

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

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

将代码块放入字符串并动态解释它们肯定是一种错误的“扩展”语言的方式,因为您正在使用的任何工具——从语法高亮工具到python解释器本身——都无法以合理的方式处理“字符串化”代码

回答这个问题:您在做的基本上是试图构造一些比python更好的编程语言,并将其动态编译为python。这个想法在脚本语言领域并不新鲜,可以是高效的,也可以是无效的(CoffeeScript是一个成功实现的例子),但是你的方法是错误的<代码>格式()
不是处理代码时要使用的工具。如果您正在编写编译器,请正确操作:使用解析器(例如pyparsing)读取AST中的代码,遍历AST生成python代码(甚至字节码),在编写过程中捕获语法错误,并采取措施提供更好的运行时反馈(例如错误上下文、行号等)。最后,确保编译器可以跨不同的python版本和实现工作


或者直接使用ruby。

Ick!定义一个正规函数;这使得调试变得更加困难。我非常讨厌这种情况。在罗马,要像罗马人那样做。使用javascript时,请按照javascript的方式操作。在python中,按照python所做的去做。难以置信。在发帖时,我想我不会说“我知道这是有争议的,不是python式的做事方式。不过,我觉得这是一个有趣的问题,我想找到一个解决方案。请不要告诉我不要这样做,而是回答实际的问题。”似乎这样的免责声明总是必要的。@Karl Knechtel和其他人:为什么这件事被否决和关闭了?我知道我所问的技术不是最佳实践,但我相信这个问题本身是正确的。这就像问“如何在PHP中以字符串的形式获取变量?”——这可能不是一个好主意,但可以回答。如果你对如何改进这个问题有具体的建议,请告诉我(例如,把它分成几个问题)。否则请重新打开它。对不起,我知道所有这些,但没有一个能回答问题!
d = self.callRemote(HelloCommand)
d.addCallback(define('response', '''
    print "callback"
    print "got response from", response["name"]
'''))