Me gustaría señalar una función que no hace nada:
def identity(*args)
return args
mi caso de uso es algo como esto
try:
gettext.find(...)
...
_ = gettext.gettext
else:
_ = identity
Por supuesto, podría usar lo identity
definido anteriormente, pero un dispositivo incorporado ciertamente funcionaría más rápido (y evitaría errores introducidos por mí mismo).
Aparentemente, map
y se filter
usa None
para la identidad, pero esto es específico para sus implementaciones.
>>> _=None
>>> _("hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
map and filter use None for the identity
?map(None, [1, 2, 3])
Respuestas:
Investigando un poco más, no hay ninguno, se solicitó una característica en el número 1673203 y Raymond Hettinger dijo que no habrá :
Entonces, una mejor manera de hacerlo es en realidad (una lambda evita nombrar la función):
O
fuente
lambda x: x
función de identidad trivial que funciona para un parámetro de cadena. @ Marcin Ojalá pudiera hacerlambda *args: *args
:-)Una función de identidad, como se define en https://en.wikipedia.org/wiki/Identity_function , toma un solo argumento y lo devuelve sin cambios:
Lo que están pidiendo para cuando usted dice que quiere la firma
def identity(*args)
es no estrictamente una función de identidad, ya que desea que se lleve varios argumentos. Está bien, pero luego se encuentra con un problema, ya que las funciones de Python no devuelven múltiples resultados, por lo que debe encontrar una manera de agrupar todos esos argumentos en un valor de retorno.La forma habitual de devolver "valores múltiples" en Python es devolver una tupla de los valores, técnicamente ese es un valor de retorno, pero puede usarse en la mayoría de los contextos como si fueran valores múltiples. Pero hacer eso aquí significa que obtienes
Y solucionar ese problema rápidamente genera otros problemas, como lo han demostrado las diversas respuestas aquí.
Entonces, en resumen, no hay una función de identidad definida en Python porque:
Para su caso preciso,
es casi seguro lo que desea: una función que tiene la misma convención de llamada y retorno que
gettext.gettext
, que devuelve su argumento sin cambios, y está claramente nombrada para describir lo que hace y dónde está destinado a ser utilizado. Me sorprendería mucho si el rendimiento fuera una consideración crucial aquí.fuente
id= lambda *args: args if len(args)>1 else args[0]
.el tuyo funcionará bien. Cuando se arregla el número de parámetros, puede usar una función anónima como esta:
fuente
lambda *args: args
. Es realmente una elección estilística.*args
versión tiene un tipo de retorno diferente, por lo que no son equivalentes incluso para el caso de argumento único.def
ylambda
para funciones tan simples.No hay una función de identidad incorporada en Python. Una imitación de la función de Haskell
id
sería:Ejemplo de uso:
Como
identity
no hace nada excepto devolver los argumentos dados, no creo que sea más lento de lo que sería una implementación nativa.fuente
No, no hay
Tenga en cuenta que su
identity
:Encajonará sus args, es decir
Por lo tanto, es posible que desee utilizar
lambda arg: arg
si desea una verdadera función de identidad.Nota: Este ejemplo sombreará la
id
función incorporada (que probablemente nunca usará).fuente
id
Si la velocidad no importa, esto debería manejar todos los casos:
Ejemplos de uso:
fuente
Trozo de una función de argumento único
gettext.gettext
(caso de ejemplo el uso de la OP) acepta un solo argumento,message
. Si uno necesita un trozo, no hay razón para regresar en[message]
lugar demessage
(def identity(*args): return args
). Así ambosencaja perfectamente.
Los errores en un caso tan trivial apenas son relevantes. Para un argumento de tipo predefinido, digamos
str
, podemosstr()
usarnos como una función de identidad (debido a la cadena interna , incluso conserva la identidad del objeto, vea laid
nota a continuación) y compare su rendimiento con la solución lambda:Una micro optimización es posible. Por ejemplo, el siguiente código de Cython :
test.pyx
Luego:
Función de identidad de objeto incorporada
No confunda una función de identidad con la
id
función incorporada que devuelve la 'identidad' de un objeto (es decir, un identificador único para ese objeto en particular en lugar del valor de ese objeto, en comparación con el==
operador), su dirección de memoria en CPython.fuente
El hilo es bastante viejo. Pero todavía quería publicar esto.
Es posible construir un método de identidad tanto para argumentos como para objetos. En el siguiente ejemplo, ObjOut es una identidad para ObjIn. Todos los otros ejemplos anteriores no han tratado con dict ** kwargs.
fuente
map(identity, [1, 2, 3])
devuelve[1, 2, 3]
?class test1(object): def __init__(self,*args,**kwargs): self.args = args self.kwargs = kwargs def identity (self): return self.args print(test1([1,2,3]).identity())
-> Resultado: ([1, 2, 3],)