Niedawno zauważyłem coś interesującego, patrząc na specyfikację gramatyki Python 3.3 :
funcdef: 'def' NAME parameters ['->' test] ':' suite
Opcjonalny blok strzałki był nieobecny w Pythonie 2 i nie mogłem znaleźć żadnych informacji dotyczących jego znaczenia w Pythonie 3. Okazuje się, że jest to poprawny Python i jest akceptowany przez interpretera:
def f(x) -> 123:
return x
Myślałem, że może to być jakaś składnia warunku wstępnego, ale:
- Nie mogę
x
tutaj przetestować , ponieważ wciąż jest niezdefiniowany, - Bez względu na to, co wstawię po strzałce (np.
2 < 1
), Nie wpływa to na zachowanie funkcji.
Czy ktoś przyzwyczajony do tej składni może to wyjaśnić?
.__annotations__
atrybut.__annotations__
atrybutem jest słownik. Kluczreturn
służy do pobierania wartości za strzałką.Są to adnotacje funkcyjne zawarte w PEP 3107 . W szczególności
->
oznacza adnotację funkcji powrotu.Przykłady:
Adnotacje to słowniki, więc możesz to zrobić:
Możesz również mieć strukturę danych w języku Python, a nie tylko ciąg znaków:
Lub możesz użyć atrybutów funkcji do sprawdzenia poprawności wywoływanych wartości:
Wydruki
źródło
Jak stwierdzono w innych odpowiedziach,
->
symbol jest używany jako część adnotacji funkcji. W nowszych wersjach Pythona>= 3.5
ma jednak określone znaczenie.PEP 3107 - Adnotacje funkcji opisują specyfikację, definiując zmiany gramatyczne, istnienie,
func.__annotations__
w którym są one przechowywane, oraz fakt, że przypadek użycia jest nadal otwarty.W Pythonie
3.5
choć PEP 484 - Rodzaj wskazówki przywiązuje znaczenia do tego jednego:->
jest używany do wskazania typu, że funkcja zwraca. Wygląda również na to, że zostanie to wymuszone w przyszłych wersjach, jak opisano w Co z istniejącymi zastosowaniami adnotacji :(Moje podkreślenie)
O
3.6
ile mi wiadomo, nie zostało to w rzeczywistości zaimplementowane, więc może zostać zderzone z przyszłymi wersjami.Zgodnie z tym podany przykład:
będzie zabronione w przyszłości (aw obecnych wersjach będzie mylące), należałoby go zmienić na:
aby skutecznie opisać tę funkcję
f
zwraca obiekt typuint
.Adnotacje nie są w żaden sposób wykorzystywane przez samego Pythona, raczej zapełniają je i ignorują. Współpracują z nimi biblioteki innych firm.
źródło
W następującym kodzie:
po
-> int
prostu mówi, żef()
zwraca liczbę całkowitą (ale nie zmusza funkcji do zwracania liczby całkowitej). Nazywa się to adnotacją zwrotną i można uzyskać do niej dostęp jakof.__annotations__['return']
.Python obsługuje również adnotacje parametrów:
: float
informuje osoby, które czytają program (oraz niektóre biblioteki / programy innych firm, np. pylint), żex
powinien to byćfloat
. Jest dostępny jakof.__annotations__['x']
i sam w sobie nie ma żadnego znaczenia. Więcej informacji znajduje się w dokumentacji:https://docs.python.org/3/reference/compound_stmts.html#function-definitions https://www.python.org/dev/peps/pep-3107/
źródło
Oznacza to rodzaj wyniku, który zwraca funkcja, ale może być
None
.Jest szeroko rozpowszechniony we współczesnych bibliotekach zorientowanych na Python 3.x.
Na przykład w wielu miejscach w kodzie biblioteki znajduje się profilowanie pand bibliotek :
źródło
def function(arg)->123:
Jest to po prostu typ zwracany, liczba całkowita w tym przypadku nie ma znaczenia, jaką liczbę napiszesz.
jak Java :
Ale w przypadku Pythona (jak powiedział Jim Fasarakis Hilliard ) typ zwracany to tylko podpowiedź , więc sugeruje powrót, ale pozwala mimo to zwrócić inny typ jak ciąg znaków ..
źródło
Moje streszczenie:
Po prostu
->
wprowadzono, aby programiści mogli opcjonalnie określić typ zwracanej funkcji. Zobacz propozycję rozszerzenia Python 3107Jest to wskazówka, jak rzeczy mogą się rozwijać w przyszłości, gdy Python jest szeroko stosowany - wskazówka w kierunku silnego pisania - to moja osobista obserwacja.
Możesz także określić typy argumentów. Określenie typu zwracanych funkcji i argumentów pomoże zmniejszyć błędy logiczne i ulepszyć ulepszenia kodu.
Możesz mieć wyrażenia jako typ zwracany (zarówno na poziomie funkcji, jak i parametru), a wyniki wyrażeń można uzyskać za pomocą atrybutu „return” obiektu adnotacji . adnotacje będą puste dla wartości wyrażenia / zwrotu dla funkcji wstawianych lambda.
źródło