Python 键函数的默认标识值
函数通常采用默认为identity函数的可选参数(返回其参数的函数,而不是)。一个典型的例子是的Python 键函数的默认标识值,python,Python,函数通常采用默认为identity函数的可选参数(返回其参数的函数,而不是)。一个典型的例子是的键参数 在我的例子中,键是一个类字段: X类: 定义初始化(self,key=None): ... self.key=key ... def方法(self,x): ... 如果是self.key: x=自钥匙(x) ... X的问题在于代码丑陋-每次使用它时,我都必须检查self.key Y类: 定义初始化(self,key=(lambda x:x)): ... self.key=key ... d
键
参数
在我的例子中,键是一个类字段:
X类:
定义初始化(self,key=None):
...
self.key=key
...
def方法(self,x):
...
如果是self.key:
x=自钥匙(x)
...
X
的问题在于代码丑陋-每次使用它时,我都必须检查self.key
Y类:
定义初始化(self,key=(lambda x:x)):
...
self.key=key
...
def方法(self,x):
...
x=自钥匙(x)
...
这很好,但是不能对Y
的实例进行酸洗:
AttributeError: Can't pickle local object 'Y.__init__.<locals>.<lambda>'
Z
是最长的版本,样板代码很难看。
(如果self.\u key不是其他self.\u key(x)
,可以使用返回x来缩短它,但有些人(虽然不是我)会避开这个成语)
那么,这里的蟒蛇方式是什么
PS。正是由于这个原因,Lisp具有该函数(并且编译器消除了对它的调用),因此lispy方法是Y
。我很想定义自己的标识
,但仅仅为默认值定义一个普通函数感觉很愚蠢。我会定义一个标识函数并将其用作默认参数:
def identity(x):
return x
class Y:
def __init__(self, key=identity):
...
self.key = key
...
def method(self, x):
...
x = self.key(x)
...
这很好,可以对这种类型的对象进行pickle处理。不过,大多数关键函数也不能进行pickle处理,不是吗?如果需要酸洗,那么在构造函数中使用用户提供的函数似乎有问题。样板代码可以写成返回self.\u key(x)If self.\u key else x
,这可能会被认为不那么难看,因为它不重复return
关键字,也没有两个缩进不同的分支。@kaya3:很多函数都可以被pickle(numpy.exp
&c)@kaya3:是的,我也喜欢这个成语,但我听说有些人不喜欢它。不管怎么说,这是蟒蛇式的方式吗Z
+return/if/else
?标识函数只需与类在同一文件中定义即可。