Chciałbym wskazać funkcję, która nic nie robi:
def identity(*args)
return args
mój przypadek użycia jest podobny do tego
try:
gettext.find(...)
...
_ = gettext.gettext
else:
_ = identity
Oczywiście mógłbym skorzystać ze identity
zdefiniowanego powyżej, ale wbudowany z pewnością działałby szybciej (i unikałby błędów wprowadzonych przeze mnie).
Najwyraźniej map
i filter
używaj None
dla tożsamości, ale jest to specyficzne dla ich implementacji.
>>> _=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])
Odpowiedzi:
Robiąc więcej badań, nie ma żadnych, zapytano o funkcję w numerze 1673203 A Raymond Hettinger powiedział, że nie będzie :
Więc lepszym sposobem na zrobienie tego jest faktycznie (lambda pozwala uniknąć nazywania funkcji):
LUB
źródło
lambda x: x
funkcję tożsamości, która działa dla jednego parametru ciągu. @Marcin Szkoda, że nie mogęlambda *args: *args
:-)Funkcja tożsamości, zgodnie z definicją podaną w https://en.wikipedia.org/wiki/Identity_function , pobiera pojedynczy argument i zwraca go w niezmienionej postaci:
To, o co prosisz, mówiąc, że chcesz, aby podpis, nie
def identity(*args)
jest ściśle funkcją tożsamości, ponieważ chcesz, aby przyjmowała wiele argumentów. W porządku, ale potem napotykasz problem, ponieważ funkcje Pythona nie zwracają wielu wyników, więc musisz znaleźć sposób na upchnięcie wszystkich tych argumentów w jedną zwracaną wartość.Zwykłym sposobem zwracania „wielu wartości” w Pythonie jest zwrócenie krotki wartości - technicznie rzecz biorąc, jest to jedna zwracana wartość, ale można jej używać w większości kontekstów tak, jakby była to wiele wartości. Ale zrobienie tego tutaj oznacza, że otrzymasz
Szybkie rozwiązanie tego problemu daje inne problemy, jak pokazały różne odpowiedzi.
Podsumowując, w Pythonie nie ma zdefiniowanej funkcji tożsamości, ponieważ:
Dla Twojego konkretnego przypadku,
jest prawie na pewno tym, czego potrzebujesz - funkcją, która ma taką samą konwencję wywoływania i zwraca jak
gettext.gettext
, która zwraca swój argument niezmieniony i jest wyraźnie nazwana, aby opisać, co robi i gdzie ma być używana. Byłbym zszokowany, gdyby wydajność była tutaj kluczowym czynnikiem.źródło
id= lambda *args: args if len(args)>1 else args[0]
.twój będzie działał dobrze. Gdy liczba parametrów jest ustalona, możesz użyć funkcji anonimowej, takiej jak ta:
źródło
lambda *args: args
. To naprawdę stylistyczny wybór.*args
wersja ma inny typ zwracania, więc nie są one równoważne nawet w przypadku pojedynczego argumentu.def
ilambda
dla takich prostych funkcji.W Pythonie nie ma wbudowanej funkcji tożsamości. Imitacja Haskell jest
id
funkcją byłoby:Przykładowe użycie:
Ponieważ
identity
nie robi nic poza zwracaniem podanych argumentów, nie sądzę, aby było to wolniejsze niż natywna implementacja.źródło
Nie, nie ma.
Zwróć uwagę, że
identity
:Będzie przechowywać swoje argumenty - tj
Więc możesz chcieć użyć,
lambda arg: arg
jeśli chcesz prawdziwej funkcji tożsamości.NB: Ten przykład będzie przesłaniał wbudowaną
id
funkcję (której prawdopodobnie nigdy nie użyjesz).źródło
id
Jeśli prędkość nie ma znaczenia, powinno to obsługiwać wszystkie przypadki:
Przykłady użycia:
źródło
Skrót funkcji jednoargumentowej
gettext.gettext
(przypadek Przykład Opisany OP) przyjmuje jeden argumentmessage
. Jeśli potrzebujesz do tego odgałęzienia, nie ma powodu, aby zwracać[message]
zamiastmessage
(def identity(*args): return args
). Tak więc obiepasuje idealnie.
Błędy w tak trywialnym przypadku są mało istotne. Dla argumentu predefiniowanego typu, powiedzmy
str
, możemy użyćstr()
samego siebie jako funkcji tożsamości (z powodu internowania ciągu znaków zachowuje nawet tożsamość obiektu, patrzid
uwaga poniżej) i porównać jego wydajność z rozwiązaniem lambda:Możliwa jest mikro-optymalizacja. Na przykład następujący kod Cython :
test.pyx
Następnie:
Wbudowana funkcja tożsamości obiektu
Nie myl funkcji tożsamości z funkcją
id
wbudowaną, która zwraca „tożsamość” obiektu (co oznacza unikalny identyfikator dla tego konkretnego obiektu, a nie wartość tego obiektu w porównaniu z==
operatorem), jego adres pamięci w CPythonie.źródło
Wątek jest dość stary. Ale nadal chciałem to opublikować.
Możliwe jest zbudowanie metody tożsamości zarówno dla argumentów, jak i obiektów. W poniższym przykładzie ObjOut jest tożsamością dla ObjIn. Wszystkie inne przykłady powyżej nie zajmowały się dict ** kwargs.
źródło
map(identity, [1, 2, 3])
powraca[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())
-> Wynik: ([1, 2, 3],)