165 votes

Est-il intégré à l'identité de la fonction en python?

Je tiens à souligner à une fonction qui ne fait rien:

def identity(*args)
    return args

mon cas d'utilisation est quelque chose comme cela

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

Bien sûr, je pourrais utiliser l' identity défini ci-dessus, mais un construit en serait certainement courir plus vite (et éviter les bugs introduits par mes propres).

Apparemment, map et filter utilisation None pour l'identité, mais c'est spécifique à leur mise en œuvre.

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

112voto

rds Points 5742

Faire un peu plus de recherche, il n'en est aucun, une fonctionnalité a été demandé dans la question 1673203 Et de Raymond Hettinger dit il n'y aura pas:

C'est mieux de laisser les gens à écrire leur propre trivial pass-through et de penser à propos de la signature et de coûts en temps.

Ainsi, une meilleure façon de le faire est en fait (un lambda évite de nommage de la fonction):

_ = lambda *args: args
  • avantage: prend un nombre quelconque de paramètres
  • inconvénient: le résultat est une version boîte des paramètres

OU

_ = lambda x: x
  • avantage: ne pas changer le type du paramètre
  • prend exactement 1 paramètre de position

23voto

tback Points 3282

le vôtre ne fonctionne correctement. Lorsque le nombre de paramètres est fixe, vous pouvez utiliser une fonction anonyme comme ceci:

lambda x: x

17voto

Ethan Furman Points 12683

Non, il n'y en a pas.

Votre version sera toujours le retour d'un n-uplet, même quand elles sont inutiles.

def identity(*args)
    return args

>>> identity(3)
(3, )

Vous pouvez faire cela dans un couple de différentes manières:

result, = identity(3)    # note the comma!
r1, r2  = identity(4, 5) # which matches multiple assignment syntax
# or
[result] = identity(3)

ou vous pouvez faire identity assez intelligent pour ne pas retourner un tuple lorsqu'il est passé d'un seul élément:

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

7voto

Marcin Points 25366

Non, il n'y en a pas.

Notez que votre identity:

  1. est équivalent à lambda *args: args
  2. Va boîte de ses args - à-d.

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

Ainsi, vous pouvez utiliser lambda arg: arg si vous voulez une vraie identité de la fonction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X