Python中有内置的身份函数吗?

191 投票
10 回答
78453 浏览
提问于 2025-04-17 09:37

我想提到一个什么都不做的函数:

def identity(*args)
    return args

我的使用场景大概是这样的

try:
    gettext.find(...)
    ...
    _ = gettext.gettext
else:
    _ = identity

当然,我可以使用上面定义的 identity 函数,但内置的函数肯定会运行得更快(而且可以避免我自己写的函数可能带来的错误)。

显然,mapfilter 在实现时使用了 None 作为身份值,但这只是它们特定的实现方式。

>>> _=None
>>> _("hello")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable

10 个回答

26

你的代码会正常运行。当参数的数量是固定的时候,你可以使用一个匿名函数,像这样:

lambda x: x
56

身份函数,简单来说,就是一个接收一个参数并返回这个参数本身的函数,详细定义可以参考这个链接

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 中没有定义身份函数的原因是:

  1. 正式的定义(一个参数的函数)并不是特别有用,而且写起来也很简单。
  2. 把定义扩展到多个参数并不明确,通常你最好定义一个适合你特定情况的版本。

对于你的具体情况,

def dummy_gettext(message):
    return message

几乎可以肯定是你想要的——一个调用方式和返回值都和 gettext.gettext 一样的函数,它返回的参数不变,并且名称清晰地描述了它的功能和用途。如果性能是这里的一个关键考虑,我会感到非常惊讶。

127

经过进一步研究,发现没有这样的功能。这个功能曾在问题1673203中被提出来过。而Raymond Hettinger说过不会有这样的功能

让人们自己写一些简单的通用函数更好,这样他们可以考虑函数的参数和时间成本。

所以其实有更好的方法来实现这个功能(使用lambda可以避免给函数命名):

_ = lambda *args: args
  • 优点:可以接受任意数量的参数
  • 缺点:结果是参数的一个封装版本

或者

_ = lambda x: x
  • 优点:不会改变参数的类型
  • 缺点:只能接受一个位置参数

撰写回答