Python:是否有语法级支持解压缩,从元组,到* anonymous *函数的
假设我们有以下内容:
args = (4,7,5) def foo(a,b,c): return a*b%c Python方便地允许元组解包: foo(4,5) # returns 3 foo(*args) # returns foo(4,5),i.e. 3 所以我们不必这样做: foo(t[0],t[1],t[2]) # a repulsive,verbose,and error-prone synonym 现在假设我们有一个类似的3元组列表,并希望每个元组t都有一个foo(t)列表.有“一种明显的方法”: list(map(lambda t: foo(*t),listoftuples)) 但现在假设foo只是一个扔掉的功能.我们不希望垃圾污染我们的命名空间.让我们在匿名的地毯下扫一扫!: list(map(lambda t: (lambda a,c: a*b%c)(*t),listoftuples)) 好吧,我们现在有嵌套的lambda.当然,我们可以解析它.但是我们冒着被误认为是一个阴谋家的风险,这个阴谋家喜欢构造神秘的法术,其唯一目的就是为那些冒昧的人重新审视我们的代码. 此外,对于这样一个简单的想法,这有点冗长.这似乎不是pythonic. (在scala中,相当于内部lambda是(_ * _%_),假设上下文允许类型推断.如果这是pythonic,它不会同样简洁吗?). 我们可以这样删除内部lambda: list(map((lambda t: t[0] * t[1] % t[2]),listoftuples)) 那更短,但令人厌恶.我发现使用幻数(而不是名称)来引用参数往往会导致错误. 如果它看起来更像这样会很棒: list(map((lambda a,c: a*b%c),listoftuples)) 当然,它不可能.这就像试图调用foo(args).我们需要一个星号,可以这么说.这是一个可能的星号: def unpackInto(func): return lambda t: func(*t) 它使代码具有令人愉悦的可读性: list(map(unpackInto(lambda a,listoftuples)) 但是我们必须始终从个人模块中导入它.这不适合协作,对于一次性使用来说有点烦人. TL; DR 我希望unpackInto成为该语言的一部分.它是否已在语法中受支持?在标准库中? 解决方法
在python2中,可以使用tuple-unpacking:
>>> def func((a,c)): ... return a+b+c ... >>> func((1,2,3)) 6 但是在python3中删除了此功能.见PEP 3113.它被删除的原因是: >他们很难反省 def func(a_b_c): a,c = a_b_c 并取得同样的结果 有了这个删除python目前不支持你想要的任何语法或任何stdlib函数. 由于这个语法是用PEP删除的,我非常怀疑核心开发人员会接受你的unpack_into函数.然而,可能很少有机会在 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |