Je voudrais signaler une fonction qui ne fait rien:
def identity(*args)
return args
mon cas d'utilisation est quelque chose comme ça
try:
gettext.find(...)
...
_ = gettext.gettext
else:
_ = identity
Bien sûr, je pourrais utiliser la identity
définition ci-dessus, mais un intégré fonctionnerait certainement plus rapidement (et éviterait les bogues introduits par moi-même).
Apparemment, map
et à filter
utiliser None
pour l'identité, mais cela est spécifique à leurs implémentations.
>>> _=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])
Réponses:
Pour faire plus de recherche, il n'y en a pas, une fonctionnalité a été posée dans le numéro 1673203 Et de Raymond Hettinger a déclaré qu'il n'y en aurait pas :
Donc, une meilleure façon de le faire est en fait (un lambda évite de nommer la fonction):
OU
la source
lambda x: x
fonction d'identité triviale qui fonctionne pour un paramètre de chaîne. @Marcin j'aimerais pouvoir fairelambda *args: *args
:-)Une fonction d'identité, telle que définie dans https://en.wikipedia.org/wiki/Identity_function , prend un seul argument et le renvoie inchangé:
Ce que vous demandez lorsque vous dites que vous voulez la signature
def identity(*args)
n'est pas strictement une fonction d'identité, car vous voulez qu'elle prenne plusieurs arguments. C'est bien, mais vous rencontrez un problème car les fonctions Python ne renvoient pas plusieurs résultats, vous devez donc trouver un moyen de regrouper tous ces arguments dans une seule valeur de retour.La manière habituelle de renvoyer des "valeurs multiples" en Python est de renvoyer un tuple des valeurs - techniquement, c'est une valeur de retour mais elle peut être utilisée dans la plupart des contextes comme s'il s'agissait de plusieurs valeurs. Mais faire cela ici signifie que vous obtenez
Et résoudre ce problème donne rapidement d'autres problèmes, comme l'ont montré les différentes réponses ici.
Donc, en résumé, il n'y a pas de fonction d'identité définie dans Python car:
Pour votre cas précis,
est presque certainement ce que vous voulez - une fonction qui a la même convention d'appel et le même retour que
gettext.gettext
, qui retourne son argument inchangé, et est clairement nommée pour décrire ce qu'elle fait et où elle est destinée à être utilisée. Je serais assez choqué si la performance était une considération cruciale ici.la source
id= lambda *args: args if len(args)>1 else args[0]
.le vôtre fonctionnera bien. Lorsque le nombre de paramètres est fixe, vous pouvez utiliser une fonction anonyme comme celle-ci:
la source
lambda *args: args
. C'est vraiment un choix stylistique.*args
version a un type de retour différent, donc ils ne sont pas équivalents même pour le cas à argument unique.def
etlambda
pour des fonctions aussi simples.Il n'y a pas de fonction d'identité intégrée dans Python. Une imitation de la fonction de Haskell
id
serait:Exemple d'utilisation:
Puisqu'il
identity
ne fait rien d'autre que renvoyer les arguments donnés, je ne pense pas que ce soit plus lent qu'une implémentation native ne le serait.la source
Non, il n'y en a pas.
Notez que votre
identity
:Va boxer ses arguments - ie
Donc, vous pouvez utiliser
lambda arg: arg
si vous voulez une véritable fonction d'identité.NB: Cet exemple va masquer la
id
fonction intégrée (que vous n'utiliserez probablement jamais).la source
id
Si la vitesse n'a pas d'importance, cela devrait gérer tous les cas:
Exemples d'utilisation:
la source
Stub d'une fonction à un seul argument
gettext.gettext
(l'exemple de cas d' utilisation OP) accepte un seul argument,message
. Si on a besoin d'un stub pour cela, il n'y a aucune raison de revenir[message]
au lieu demessage
(def identity(*args): return args
). Ainsi les deuxs'adapter parfaitement.
Les bogues dans un cas aussi trivial sont à peine pertinents. Pour un argument de type prédéfini, disons
str
, nous pouvons nous utiliserstr()
comme fonction d'identité (en raison de la chaîne interne, il conserve même l'identité de l'objet, voir laid
note ci-dessous) et comparer ses performances avec la solution lambda:Une micro-optimisation est possible. Par exemple, le code Cython suivant:
test.pyx
Ensuite:
Fonction d'identité d'objet intégrée
Ne confondez pas une fonction d'identité avec la
id
fonction intégrée qui renvoie `` l'identité '' d'un objet (c'est-à-dire un identifiant unique pour cet objet particulier plutôt que la valeur de cet objet, par rapport à l'==
opérateur), son adresse mémoire en CPython.la source
Le fil est assez vieux. Mais je voulais toujours publier ceci.
Il est possible de créer une méthode d'identité pour les arguments et les objets. Dans l'exemple ci-dessous, ObjOut est une identité pour ObjIn. Tous les autres exemples ci-dessus n'ont pas traité de dict ** kwargs.
la source
map(identity, [1, 2, 3])
retours de questions d'origine[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())
-> Résultat: ([1, 2, 3],)