Python中有内置的身份函数吗?
我想提到一个什么都不做的函数:
def identity(*args)
return args
我的使用场景大概是这样的
try:
gettext.find(...)
...
_ = gettext.gettext
else:
_ = identity
当然,我可以使用上面定义的 identity
函数,但内置的函数肯定会运行得更快(而且可以避免我自己写的函数可能带来的错误)。
显然,map
和 filter
在实现时使用了 None
作为身份值,但这只是它们特定的实现方式。
>>> _=None
>>> _("hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
10 个回答
你的代码会正常运行。当参数的数量是固定的时候,你可以使用一个匿名函数,像这样:
lambda x: x
身份函数,简单来说,就是一个接收一个参数并返回这个参数本身的函数,详细定义可以参考这个链接。
def identity(x):
return x
当你说想要一个签名为 def identity(*args)
的函数时,其实你并不是在要求一个严格意义上的身份函数,因为你希望它能接收多个参数。这没问题,但这里就出现了一个问题:Python 的函数不能返回多个结果,所以你需要想办法把所有这些参数放到一个返回值里。
在 Python 中,通常返回“多个值”的方法是返回一个元组(tuple)——从技术上讲,这算是一个返回值,但在大多数情况下可以像多个值那样使用。不过这样做会导致你得到
>>> def mv_identity(*args):
... return args
...
>>> mv_identity(1,2,3)
(1, 2, 3)
>>> # So far, so good. But what happens now with single arguments?
>>> mv_identity(1)
(1,)
而解决这个问题又会引发其他问题,正如这里的各种回答所展示的那样。
所以,总结一下,Python 中没有定义身份函数的原因是:
- 正式的定义(一个参数的函数)并不是特别有用,而且写起来也很简单。
- 把定义扩展到多个参数并不明确,通常你最好定义一个适合你特定情况的版本。
对于你的具体情况,
def dummy_gettext(message):
return message
几乎可以肯定是你想要的——一个调用方式和返回值都和 gettext.gettext
一样的函数,它返回的参数不变,并且名称清晰地描述了它的功能和用途。如果性能是这里的一个关键考虑,我会感到非常惊讶。
经过进一步研究,发现没有这样的功能。这个功能曾在问题1673203中被提出来过。而Raymond Hettinger说过不会有这样的功能:
让人们自己写一些简单的通用函数更好,这样他们可以考虑函数的参数和时间成本。
所以其实有更好的方法来实现这个功能(使用lambda可以避免给函数命名):
_ = lambda *args: args
- 优点:可以接受任意数量的参数
- 缺点:结果是参数的一个封装版本
或者
_ = lambda x: x
- 优点:不会改变参数的类型
- 缺点:只能接受一个位置参数