python中是否有内置的身份识别function?
我想指出一个什么都不做的函数:
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
做了一些更多的研究,没有,在问题1673203问一个function,并从雷蒙德Hettinger说,将不会有 :
最好让人们写下他们自己的微不足道的传递,思考签名和时间成本。
所以更好的方法是(lambda避免命名该函数):
_ = lambda *args: args
- 优点:可以使用任意数量的参数
- 缺点:结果是盒装版本的参数
要么
_ = lambda x: x
- 好处:不改变参数的types
- 缺点:只需要一个位置参数
不,没有一个内置的identity
function,但写一个适合单一和多重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
:
- 相当于lambda * args:args
-
会把它的参数 – 即
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}