python中是否有内置的身份识别function?

我想指出一个什么都不做的函数:

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 

做了一些更多的研究,没有,在问题1673203问一个function,并从雷蒙德Hettinger说,将不会有 :

最好让人们写下他们自己的微不足道的传递,思考签名和时间成本。

所以更好的方法是(lambda避免命名该函数):

 _ = lambda *args: args 
  • 优点:可以使用任意数量的参数
  • 缺点:结果是盒装版本的参数

要么

 _ = lambda x: x 
  • 好处:不改变参数的types
  • 缺点:只需要一个位置参数

不,没有一个内置的identityfunction,但写一个适合单一和多重input的行为并不困难:

 def identity(*args): if len(args) == 1: return args[0] return args 

并在使用中:

 >>> identity(4) 4 # passed in a single object, got that object back >>> identity(4, 5, 6) (4, 5, 6) # passed in several objects, got those same objects back 

虽然你可能会认为第二个结果是一个tuple ,并且你没有将一个tuple传递给identity函数,但是你也应该认识到, tuple是Python如何将一组对象作为一个单独的实体传递,而使用你会想要:

 >>> params = 5 >>> params 5 >>> params = identity(params) >>> params 5 >>> params = 5, 6, 7 >>> params (5, 6, 7) >>> params = identity(params) >>> params (5, 6, 7) >>> params = identity(*params) >>> params (5, 6, 7) 

rds的版本将会:

  • 总是返回一个元组,即使不必要的时候; 要么
  • 给出多个参数时失败

rds的第一个版本(没有名字,分配给_ ):

 >>> _ = lambda *args: args >>> _(3) (3, ) # passed in an integer, got back a tuple 

rds的第二个版本(也没有名字,也分配给_ ):

 >>> _ = lambda x: x >>> _(3, 6 ,9) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: <lambda>() takes exactly 1 argument (3 given) 

注意:它甚至可以在传递一个元素的时候工作:

 >>> identity(1) 1 >>> identity((1,)) (1,) 

你的工作正常。 当参数的数量是固定的,你可以使用这样的匿名函数:

 lambda x: x 

不,没有。

请注意你的identity

  1. 相当于lambda * args:args
  2. 会把它的参数 – 即

     In [6]: id = lambda *args: args In [7]: id(3) Out[7]: (3,) 

所以,如果你想要一个真正的标识函数,你可能想使用lambda arg: arg

线程很旧。 但还是想发贴这个。

可以为参数和对象构build标识方法。 在下面的例子中,ObjOut是ObjIn的一个标识。 上面的所有其他例子都没有涉及到dict ** kwargs。

 class test(object): def __init__(self,*args,**kwargs): self.args = args self.kwargs = kwargs def identity (self): return self objIn=test('arg-1','arg-2','arg-3','arg-n',key1=1,key2=2,key3=3,keyn='n') objOut=objIn.identity() print('args=',objOut.args,'kwargs=',objOut.kwargs) #If you want just the arguments to be printed... print(test('arg-1','arg-2','arg-3','arg-n',key1=1,key2=2,key3=3,keyn='n').identity().args) print(test('arg-1','arg-2','arg-3','arg-n',key1=1,key2=2,key3=3,keyn='n').identity().kwargs) $ py test.py args= ('arg-1', 'arg-2', 'arg-3', 'arg-n') kwargs= {'key1': 1, 'keyn': 'n', 'key2': 2, 'key3': 3} ('arg-1', 'arg-2', 'arg-3', 'arg-n') {'key1': 1, 'keyn': 'n', 'key2': 2, 'key3': 3}