Python 键函数的默认标识值

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

函数通常采用默认为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
...
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
?标识函数只需与类在同一文件中定义即可。