标签:python language-design lambda coding-style iterable-unpacking
假设我们有以下内容:
args = (4,7,5)
def foo(a,b,c): return a*b%c
Python方便地允许元组解包:
foo(4,7,5) # returns 3
foo(*args) # returns foo(4,7,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, b, 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, b, c: a*b%c), listoftuples))
当然,它不可能.这就像试图调用foo(args).我们需要一个星号,可以这么说.这是一个可能的星号:
def unpackInto(func): return lambda t: func(*t)
它使代码具有令人愉悦的可读性:
list(map(unpackInto(lambda a, b, c: a*b%c), listoftuples))
但是我们必须始终从个人模块中导入它.这不适合协作,对于一次性使用来说有点烦人.
TL; DR
我希望unpackInto成为该语言的一部分.它是否已在语法中受支持?在标准库中?
解决方法:
在python2中,可以使用tuple-unpacking:
>>> def func((a,b,c)):
... return a+b+c
...
>>> func((1,2,3))
6
但是在python3中删除了此功能.见PEP 3113.它被删除的原因是:
>他们很难反省
>他们不会引入任何功能,因为您可以创建如下功能:
def func(a_b_c):
a,b,c = a_b_c
并取得同样的结果
>他们提供了丑陋的错误消息
有了这个删除python目前不支持你想要的任何语法或任何stdlib函数.
由于这个语法是用PEP删除的,我非常怀疑核心开发人员会接受你的unpack_into函数.然而,可能很少有机会在functools
模块中添加类似的内容,其中应包含此类内容.你应该向python开发人员询问这个问题,但一定要提供好的参数来支持你的请求.
标签:python,language-design,lambda,coding-style,iterable-unpacking 来源: https://codeday.me/bug/20190716/1477839.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。