3.x中的元组参数解包

-----开始PGP签名-------------
版本:gnupg v1.4.9(gnu/linux)
ieyearecaayfakjlqnwacgkq6nfwy35f3tj8ywcgox+xdmedta kdn9q8kzavfne4
0/4AMWZGCLR8ZMONPAFNFSAOTHN4JHFY
= htwe
-----结束PGP签名-----

# 回答1


马丁·盖斯勒:
我同意很多。我可以通过排序/排序显示我的代码的类似示例
其中包含一个lambda,该lambda是将2或3个项目序列序列序列的
定义排序键。
正如我过去所说的那样,我想看到更多对模式的支持
在Python中匹配,而不是更少。来自Mathematica的人,
Scala,Ocaml等知道它们可以有用,Scala表明
Python也可能会找到一些用法。
我认为它们已删除(一部分,不完全)此Python功能
主要是为了简化CPYTHON的C实现。
到目前为止,我认为这种去除,而不是使用{:}作为空数组字面
是在Python的设计期间唯一犯的两个错误。如果您
查看在此期间做出的大量设计决策
创建Python 3本身,我认为这是一个异常好
无论如何。
再见,
# 回答2


Martin Geisler 我认为没有多少人会错过DEF陈述中的包装。
我认为警告可能无论如何都是错误的 - 您只需要删除
一些帕伦斯...

Python 3.0RC1(R30RC1:66499,2008年10月4日,11:04:33)
文件" ",第1行
f = lambda(ai,bi):ai * bi
^
语法:语法无效

6
同样地
文件" ",第1行
lambda(i,s):( field(i + 1),s)
^
语法:语法无效
<功能
因此,只需删除括号,就可以了。
我不得不说我更喜欢命名函数,但我没有做太多
功能编程
Def F(AI,BI):
返回ai * bi
CI.Addcallback(F)
def f(i,s):
返回字段(i + 1),s
地图(F,枚举(SI))
PEP-3113需要更新,因为这里肯定会令人困惑! 2to3是
也通过它的外观做错了事。
- -
Nick Craig-Wood
# 回答3


尼克·克雷格·伍德(Nick Craig-Wood)写道:
我认为没有多少人会错过DEF陈述中的包装。
我认为警告可能无论如何都是错误的 - 您只需要删除
一些帕伦斯...

Python 3.0RC1(R30RC1:66499,2008年10月4日,11:04:33)
文件" ",第1行
f = lambda(ai,bi):ai * bi
^
语法:语法无效

6
同样地
文件" ",第1行
lambda(i,s):( field(i + 1),s)
^
语法:语法无效
<功能
因此,只需删除括号,就可以了。
不,您会在此过程中更改功能签名。
f = lambda(a,b):a*b
等同于
def f((a,b)):#double parens
返回A*B
并称为f(arg),其中arg是一个具有两个项目的峰值。
在3.0中,它必须被重写为
def f(ab):
a,b = ab
返回A*B
一世。 e。它需要陈述和表达,因此不再是
适用于lambda。
彼得
# 回答4

-----开始PGP签名-------------
版本:gnupg v1.4.9(gnu/linux)
ieyearecaayfakjnhqmacgkq6nfwy35f3tgrmwcg3kroniu1q3 3wfqqmxm1xhoylo
8HSAN1S+T8EHTDKCY6/WKIQ4034RXPYY
= OWC1
-----结束PGP签名-----
# 回答5


马丁·盖斯勒(Martin Geisler)写道:
一些。栏的主体的 *代码 *被编译为编译的一部分
FOO的主体,但是foo的每个调用都会创建一个新的 *函数 *对象。
替代方法是传递所需的值。
tjr
# 回答6


-----开始PGP签名-------------
版本:gnupg v1.4.9(gnu/linux)
ieyearecaayfakjn2lqacgkq6nfwy35f3til5gcdffodpkskc0 tn6yhljwrcsvaf
EA8AOOIX4R/H1CRTNZCPUUM771IIGFVY
=/nci
-----结束PGP签名-----
# 回答7


在2008年10月4日星期六22:57:23 +0200,马丁·盖斯勒(Martin Geisler)写道:
鉴于大多数Lambda都很短,真的很痛苦地使用(在上面的示例中)AB [0]*AB [1]而无需打包?

好吧 - 这是因为代码曾经是短而甜的,所以感觉
对我丑陋改变
lambda(a,b):a * b
进入
Lambda AB:AB [0] * AB [1]
第一个看起来很完美 - 它与我是代码背后的数学相匹配
写作。第二个看起来不太好。
这是另一种选择。相比:
6
有了这个:
6
las,我认为为时已晚。我感到你的痛苦。
Python 3.0的最终版本尚未制作。如果你真的在乎
强烈地,您可以写入Python-Dev邮件列表,并
询问是否值得尝试改变元组打开包装的主意。
他们几乎肯定会说不,但是有可能是
在3.1中恢复。
一个微小的机会。
- -
史蒂文

# 回答8


在2008年10月4日星期六17:07:14 +0200,马丁·盖斯勒(Martin Geisler)写道:
这是主要优势,其次是减少命名空间污染,但
是的,有很小的性能罚款。
....返回x+1
...
....返回外部(x+1)
...
.... def内(x):
....返回x+1
....返回内部(x+1)
...
[1.5711719989776611,0.82663798332214355,0.82708191871643066]
[1.8273210525512695,1.1913230419158936,1.17862200736999951]
- -
史蒂文
# 回答9


-----开始PGP签名-------------
版本:gnupg v1.4.9(gnu/linux)
ieyearecaayfakjofrmacgkq6nfwy35f3tgkewcfch21zg02fq 7gy+polrrdywg9k
UH8AN3CVMNYANF3EKOA4E9UZMOCTPDAC
= DGZP
-----结束PGP签名-----
# 回答10


-----开始PGP签名-------------
版本:gnupg v1.4.9(gnu/linux)
ieyearecaayfakjofe4acgkq6nfwy35f3tixvgceklrvmjc65x lrfm6h6iqtyh2a
1HWAONPPVQ+82BT/FJNFFBVS2IPFMA2/
= ekst
-----结束PGP签名-----
# 回答11


Martin Geisler 如果您只需要与该模式抗衡,那么您可以写一个
装饰器要解开一个论点。也许不是理想的,但是你有
写的选项:
@unpacked
DEF产品(A,B):
返回A*B
CI.Addcallback(产品)
或者
CI.Addcallback(打开包装(Lambda A,B:A*B))
对于未包装的一些合适定义。
# 回答12


PEP 3113为RE提供以下建议 分解元组
参数:
def fxn((a,(b,c))):
经过
将被翻译成:
DEF FXN(A_B_C):
(a,(b,c))= a_b_c
经过
Lambdas的重命名类似。 http://www.python.org/dev/peps/pep-3113/
我想建议这个命名公约与一个非常
通用命名约定,lower_case_with_underscores。这很容易
查看您是否将上面的参数a,b,c替换为更多的东西
实际的:
def函数(vocab_list,(结果,标志),max_value)
变成:
def函数(vocab_list,result_flag,max_value)
功能注释可能会有所帮助,但并非每个人都会使用它们
以相同的方式,甚至以有用的方式和2to3工具
不添加注释。
避免所有命名公约冲突可能是不可能的,但是我会
喜欢提出一种区分重命名的替代方案
元组和一个带有两个单词的参数名称:
def函数(vocab_list,(结果,标志),max_value):
经过
变成:
def函数(vocab_list,t _result_flag,max_value):
结果,flag = t__Result_flag
经过
" T__"前缀清楚地标记了元组参数与
其他。双重下划线的使用在命名惯例中是不寻常的,
因此,与其他公约发生冲突的可能性较小。 Python用户是
已经训练以区分单个和双重下划线。然后
比当前的2to3行为长三个字符,长度
比较原始元组形式:
t__Result_flag
(结果,标志)
人们怎么看?值得将其带入Python-Dev列表吗?
- -
史蒂文
# 回答13


史蒂文·达·阿普拉诺(Steven D'Aprano)写道:
最重要的单词应该首先出现
这个案例:
result_flag__t
但是,我承认其他人可以学会不同的命令
扫描单词比我,特别是根据他们的口语
背景。新闻组的民意调查在学术上并不是完全
公正的采样,但是没有更好的做出决定的方法,
在那儿? (我认为养成一个习惯很容易。)
这是在相同上下文中的另一个选项:
def函数(vocab_list,result_flag__t,max_value):
结果,flag = result_flag___t
经过
要彻底,还有一个尾随的双重指标选项。
def函数(vocab_list,result_flag__,max_value):
结果,flag = result_flag________________________________
经过
我不从任何其他用法中认识到,但我延迟了。如果有
有条件地,我认为这是我的最爱。
# 回答14


史蒂文·达·阿普拉诺(Steven D'Aprano)写道:
让我们看看转换工具的作用:
$ cat tmp.py
g = lambda(a,b):a*b + a_b
$ 2to3 tmp.py
RefactoringTool:跳过隐式修复程序:缓冲区
RefactoringTool:跳过隐式修复程序:成语
RefactoringTool:跳过隐式修复程序:WS_COMMA
--- tmp.py(原始)
+++ tmp.py(重构)
@@ -1,1 +1,1 @@
-g = lambda(a,b):a*b + a_b
+ g = lambda a_b1:a_b1 [0]*a_b1 [1] + a_b
RefactoringTool:需要修改的文件:
RefactoringTool:tmp.py
因此当前策略 Y是要添加数值后缀,如果出现名称冲突。
固定器显然不是最终状态,而不是lambdas
它使用xxx_todo_changeme。
我想实际的冲突很少见。如果没有冲突,A_B是
最好的名字,我更喜欢在其他任何事情之前尝试一下。
除了我,我不特别关心后卫应该是什么
认为它应该比当前的数值前缀更具脱颖而出。
XXX1_A_B,XXX2_A_B,...也许?
彼得
# 回答15


史蒂文·达·阿普拉诺(Steven D'Aprano)写道:
让我们看看转换工具的作用:
$ cat tmp.py
g = lambda(a,b):a*b + a_b
$ 2to3 tmp.py
RefactoringTool:跳过隐式修复程序:缓冲区
RefactoringTool:跳过隐式修复程序:成语
RefactoringTool:跳过隐式修复程序:WS_COMMA
--- tmp.py(原始)
+++ tmp.py(重构)
@@ -1,1 +1,1 @@
-g = lambda(a,b):a*b + a_b
+ g = lambda a_b1:a_b1 [0]*a_b1 [1] + a_b
RefactoringTool:需要修改的文件:
RefactoringTool:tmp.py
因此,当前的策略是如果出现名称冲突,则添加数值后缀。
固定器显然不是最终状态,而不是lambdas
它使用xxx_todo_changeme。
我想实际的冲突很少见。如果没有冲突,A_B是
最好的名字,我更喜欢在其他任何事情之前尝试一下。
除了我,我不特别关心后卫应该是什么
认为它应该比当前的数值后缀更具脱颖而出。
XXX1_A_B,XXX2_A_B,...也许?
彼得
# 回答16


马丁·盖斯勒(Martin Geisler)写道:
并且有很好的选择,并且有技术
面对其他论点的维护功能的原因
选项将是一个麻烦。
las,我认为为时已晚。我感到你的痛苦。

谢谢!我知道为时已晚,我应该知道这一点
较早:-(
对于将来的参考,说明某事的时候
在3个月的Alpha阶段,用于测试功能和API
变化。我怀疑,从阅读Pydev讨论中,答案
仍然会使用DEF语句,然后添加拆箱
行或下标元组arg坚持使用lambda表达式。
但是谁知道?
tjr

# 回答17


2008年10月5日在阳光下," Aaron \" Castironpi \" Brady"写道:
t__Result_flag和result_flag__t有一个优势
如果您想
查找并更改来源中的所有这些位置。您可以比较
它决定使用reinterpret_cast (...)作为演员
C ++的操作员。这很丑陋,但要比(长)容易得多。
仅搜索__在Python中会有太多的命中。
Harald
# 回答18


布雷特c。:
是否有方法可以从划痕相似的本地模式重新实现 -
Cpython中的匹配功能,例如闭合:http://items.sjbach.com/16/some-notes-about-clojure
或更好的Scala(甚至是OCAML),但它们是静态的),等等
避免了疼痛和内省的麻烦?
再见,
熊熊
# 回答19


2008年10月5日在阳光下17:15:27 +0200,彼得·奥特(Peter Otten)写道:
让我们看看转换工具的作用:
$ cat tmp.py
g = lambda(a,b):a*b + a_b
$ 2to3 tmp.py
RefactoringTool:跳过隐式修复程序:缓冲区重构工具:
跳过隐式修复程序:习惯重新分配工具:跳过隐式
修复程序:WS_COMMA --- TMP.PY(原始)
+++ tmp.py(重构)
@@ -1,1 +1,1 @@
-g = lambda(a,b):a*b + a_b
+ g = lambda a_b1:a_b1 [0]*a_b1 [1] + a_b recactoringTool:需要的文件
要修改:RefactoringTool:tmp.py
因此,当前的策略是添加一个数字后缀,如果名称发生冲突
发生。固定器显然不是最终状态,而不是函数
Lambdas的使用xxx_todo_changeme。
我想实际的冲突很少见。如果没有冲突A_B是
最好的名字,我更喜欢在其他任何事情之前尝试一下。我不
特别关心后备应有的东西,除了我认为
它应该比当前的数值后缀更具脱颖而出。
XXX1_A_B,XXX2_A_B,...也许?

您可能误解了我。我不关心冲突
在名称之间,如下:
lambda a_b,(a,b):
映射到-lambda a_b,a_b:
我也期望它们将是罕见的,最好用任何机制来处理
修复程序用户可以修复任何其他命名冲突。
我说的是 *公约 *之间的冲突
a_b表单的许多参数名称,这些名称不打算为两个项目
元组。
在Python 2.x中,当您看到功能签名时
def垃圾邮件(x,(a,b))
很明显,您必须通过一个两个项目的元组作为
第二个参数。但是将其重写为垃圾邮件(x,a_b),没有这样的
帮助。 Python中没有惯例说:"当您看到功能时
A_B表格的论点,您需要传递两个项目"(也不应在那里
是)。
但是考虑到这个问题上的沉默,显然是其他人
不太在乎误导论证名称。
*眨眼*
- -
史蒂文

# 回答20


10月11日,8:23*上午,史蒂文·d'Aprano cybersource.com.auwrote:
您可能误解了我。我不关心冲突
在名称之间,如下:
lambda a_b,(a,b):
映射到-lambda a_b,a_b:
我也期望它们将是罕见的,最好用任何机制来处理
修复程序用户可以修复任何其他命名冲突。
我说的是 *公约 *之间的冲突
a_b表单的许多参数名称,这些名称不打算为两个项目
元组。
在Python 2.x中,当您看到功能签名时
def垃圾邮件(x,(a,b))
很明显,您必须通过一个两个项目的元组作为
第二个参数。但是将其重写为垃圾邮件(x,a_b),没有这样的
帮助。 Python中没有惯例说:"当您看到功能时
A_B表格的论点,您需要传递两个项目"(也不应在那里
是)。
但是考虑到这个问题上的沉默,显然是其他人
不太在乎误导论点名称 s。 *眨眼* 可能是双重下划线,例如A__B, first_item__second_item?
# 回答21

10月11日,2:23*上午,史蒂文·d'Aprano

标签: python

添加新评论