Ich möchte auf eine Funktion verweisen, die nichts bewirkt:
def identity(*args)
return args
Mein Anwendungsfall ist so etwas
try:
gettext.find(...)
...
_ = gettext.gettext
else:
_ = identity
Natürlich könnte ich das identity
oben definierte verwenden, aber ein eingebautes würde sicherlich schneller laufen (und Fehler vermeiden, die von mir selbst verursacht wurden).
Anscheinend map
und filter
Verwendung None
für die Identität, aber dies ist spezifisch für ihre Implementierungen.
>>> _=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])
Antworten:
Bei weiteren Nachforschungen gibt es keine, ein Feature wurde in Ausgabe 1673203 gefragt. Und von Raymond Hettinger sagte, es werde keine geben :
Ein besserer Weg, dies zu tun, ist tatsächlich (ein Lambda vermeidet es, die Funktion zu benennen):
ODER
quelle
lambda x: x
Identitätsfunktion, die für einen Zeichenfolgenparameter funktioniert. @Marcin Ich wünschte, ich könnte tunlambda *args: *args
:-)Eine Identitätsfunktion, wie sie in https://en.wikipedia.org/wiki/Identity_function definiert ist , nimmt ein einzelnes Argument und gibt es unverändert zurück:
Was Sie verlangen, wenn Sie sagen, dass Sie die Signatur möchten,
def identity(*args)
ist keine reine Identitätsfunktion, da Sie möchten, dass mehrere Argumente verwendet werden. Das ist in Ordnung, aber dann stoßen Sie auf ein Problem, da Python-Funktionen nicht mehrere Ergebnisse zurückgeben. Sie müssen also einen Weg finden, alle diese Argumente in einen Rückgabewert zu packen.Die übliche Methode zum Zurückgeben von "mehreren Werten" in Python besteht darin, ein Tupel der Werte zurückzugeben - technisch gesehen ist dies ein Rückgabewert, der jedoch in den meisten Kontexten verwendet werden kann, als wären es mehrere Werte. Aber das hier zu tun bedeutet, dass Sie bekommen
Und die schnelle Behebung dieses Problems führt zu anderen Problemen, wie die verschiedenen Antworten hier gezeigt haben.
Zusammenfassend ist in Python keine Identitätsfunktion definiert, weil:
Für Ihren genauen Fall,
ist mit ziemlicher Sicherheit das, was Sie wollen - eine Funktion, die dieselbe Aufrufkonvention und Rückgabe wie hat
gettext.gettext
, die ihr Argument unverändert zurückgibt und eindeutig benannt ist, um zu beschreiben, was sie tut und wo sie verwendet werden soll. Ich wäre ziemlich schockiert, wenn die Leistung hier eine entscheidende Rolle spielen würde.quelle
id= lambda *args: args if len(args)>1 else args[0]
.Ihre wird gut funktionieren. Wenn die Anzahl der Parameter festgelegt ist, können Sie eine anonyme Funktion wie die folgende verwenden:
quelle
lambda *args: args
. Es ist wirklich eine stilistische Wahl.*args
Version hat einen anderen Rückgabetyp, daher sind sie selbst für den Fall mit einem Argument nicht gleichwertig.def
undlambda
für solch einfache Funktionen.In Python ist keine Identitätsfunktion integriert. Eine Nachahmung der Haskell-
id
Funktion wäre:Anwendungsbeispiel:
Da
identity
nichts anderes tut, als die angegebenen Argumente zurückzugeben, denke ich nicht, dass es langsamer ist als eine native Implementierung.quelle
Nein, gibt es nicht.
Beachten Sie, dass Ihre
identity
:Wird seine Argumente boxen - dh
Daher möchten Sie möglicherweise verwenden,
lambda arg: arg
wenn Sie eine echte Identitätsfunktion wünschen.NB: In diesem Beispiel wird die integrierte
id
Funktion (die Sie wahrscheinlich nie verwenden werden) beschattet .quelle
id
Wenn die Geschwindigkeit keine Rolle spielt, sollte dies alle Fälle behandeln:
Anwendungsbeispiele:
quelle
Stub einer Einzelargumentfunktion
gettext.gettext
(der Anwendungsfall des OP) akzeptiert ein einzelnes Argumentmessage
. Wenn man dafür einen Stub braucht, gibt es keinen Grund,[message]
stattmessage
(def identity(*args): return args
) zurückzukehren. Also beidespasst perfekt.
Fehler in einem so trivialen Fall sind kaum relevant. Für ein Argument vom vordefinierten Typ können wir
str
unsstr()
beispielsweise als Identitätsfunktion verwenden (da die Zeichenfolge interniert , behält es sogar die Objektidentität bei, sieheid
Hinweis unten) und seine Leistung mit der Lambda-Lösung vergleichen:Eine Mikrooptimierung ist möglich. Zum Beispiel der folgende Cython- Code:
test.pyx
Dann:
Integrierte Objektidentitätsfunktion
Verwechseln Sie eine Identitätsfunktion nicht mit der
id
integrierten Funktion, die die 'Identität' eines Objekts (dh eine eindeutige Kennung für dieses bestimmte Objekt und nicht den Wert dieses Objekts im Vergleich zum==
Operator), seine Speicheradresse in CPython, zurückgibt.quelle
Der Thread ist ziemlich alt. Wollte das aber trotzdem posten.
Es ist möglich, eine Identitätsmethode sowohl für Argumente als auch für Objekte zu erstellen. Im folgenden Beispiel ist ObjOut eine Identität für ObjIn. Alle anderen obigen Beispiele haben sich nicht mit diktierten ** kwargs befasst.
quelle
map(identity, [1, 2, 3])
zurückkehrt[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())
-> Ergebnis: ([1, 2, 3],)