2012-12-09 2 views
33

Przeszedłem przez pierwsze dwa odcinki w PEP 3107, ale nadal nie wiem, co robią dla tego języka. Wydaje mi się, że możesz dodawać metadane do funkcji używających dekoratorów. na przykładCo to są adnotacje funkcji Python?

def returns(return_type): 
    f.return_type = return_type # <- adding metadata here 
    return f 

@returns(Foo) 
def make_foo(): ... 

Możesz dodać metadane do argumentów za i może to wyglądać całkiem jeśli skorzystać z domyślnych argumentów, tak jak poniżej:

import inspect 

def defaults_are_actually_metadata(f): 
    names, args_name, kwargs_name, defaults = inspect.getfuncspec(f) 
    f.parameter_metadata = dict(zip(names[-len(defaults):], defaults)) 
    f.__defaults__ =() 
    return f 

@defaults_are_actually_metadata 
def haul(load="Stuff to be carried.", 
     speed_mph="How fast to move the load (in miles per hour)."): ... 

Przynajmniej moje pierwsze wrażenie jest takie, że adnotacje są zbędne: dekoratorzy może zrobić wszystko, co mogą adnotacje (i więcej). Dlaczego adnotacje są lepsze od dekoratorów, jeśli chodzi o dodawanie metadanych do funkcji?

+4

Adnotacje są na razie eksperymentem i rodzajem pracy w toku. Na liście [python-ideas] znajduje się ostatnio wątek (http: //mail.python .org/pipermail/python-ideas/2012-December/thread.html) na temat, który może być pomocny –

+0

@JohnY Chcę zaznaczyć twoją odpowiedź jako "poprawną", ale nie jest to "oficjalna" odpowiedź! – allyourcode

Odpowiedz

31

Jak wspomniano, istotne jest 3107 PEP (połączone dla łatwego odniesienia w przypadku innych napotykają na to pytanie jeszcze nie czytać).

Adnotacje są na razie eksperymentem i rodzajem pracy w toku. Wątek w numerze python-ideas mailing list jest w tej chwili bardzo przydatny. (Podany link jest przeznaczony tylko dla archiwum miesięcznego, uważam, że adres URL konkretnych wpisów zmienia się okresowo.Ten wątek jest bliski początku grudnia i zatytułowany "Konwencje [Python-ideas] dla adnotacji funkcji". pierwszy post jest Thomas Kluyver dniu gru 1.)

Oto nieco od siebie stanowisk Guido van Rossum w tym wątku:

on 12/4/2012 11:43 AM, Jasper St.Pierre napisał:

Rzeczywiście. Już wcześniej analizowałem adnotacje, ale nigdy nie rozumiałem, jaki jest cel. Wydawało się, że jest to funkcja, która została zaprojektowana i wdrożona bez jakiegoś celu i gdzie społeczność miała sama odkryć cel: .

Guido odpowiedź:

przeciwnie. Było zbyt wiele przypadków użycia, które natychmiast wyglądały na ważne, i nie mogliśmy ustalić, które z nich są najbardziej istotne i jak je połączyć, dlatego zdecydowaliśmy się na dwuetapowe podejście: : w kroku 1 zaprojektował składnię, podczas gdy w kroku 2 zaprojektowalibyśmy semantykę. Pomysł był bardzo jasny, że po ustaleniu składni ludzie mogliby swobodnie eksperymentować z różnymi semantykami - po prostu nie w stdlib. Pomysł był również taki, że w końcu z tych wszystkich eksperymentów wyłoniłoby się, że byłoby odpowiednie dla stdlib.

Jasper St. Pierre:

Więc, jeśli mogę zapytać, co było pierwotnym celem adnotacji? PEP daje pewne sugestie, ale nie pozostawia nic konkretnego. Czy został zaprojektowany jako pomoc dla IDE, czy narzędzia do analizy statycznej, które sprawdzają kod źródłowy? Coś, co można uzyskać, aby aplikacje same się ułożyły, aby zapewnić specjalne zachowania, takie jak analizator składni wiersza poleceń lub kontroler statyczny środowiska wykonawczego?

Guido odpowiedź:

Prawie wszystkie powyższe do pewnego stopnia. Ale dla mnie osobiście, głównym celem było zawsze uzyskanie notacji, aby określić ograniczenia typu (i być może inne ograniczenia) dla argumentów i zwracać wartości . W różnych czasach bawiłem się różnymi sposobami łączenia typów: . Na przykład. lista [int] może oznaczać listę liczb całkowitych i dict [str, tuple [float, float, float, bool]] może oznaczać łańcuchy mapowania dyktafonów do krotek trzech spławików i bool. Ale czułem, że o wiele trudniej jest uzyskać zgodę na takie notowanie, niż na temat składni adnotacji o argumencie (pomyśl o tym, ile można wnieść do tych dwóch przykładów :-) - Zawsze miałem silny chęć użycia "var: type = default" i uczynienie typu wyrażenia w czasie wykonywania do oceny w tym samym czasie, co ustawienie domyślne.

I odrobinę humoru od Ned Batchelder:

Wymownym chwila była dla mnie podczas wczesnej Py3k keynote na PyCon (? Może było w Dallas i Chicago), Guido mogłem” t zapamiętać słowo "adnotacja" i powiedział: "wiesz, te rzeczy, które nie są deklaracjami typu ?":-)

8

myślę, że pierwszy akapit stwierdza wszystko:

Ponieważ seria 2.x Pythona brakuje standardowy sposobem opisywania parametrów danej funkcji, czyli i zwracane wartości

(kopalnia nacisk)

Posiadanie standardowego sposobu wykonania tej czynności ma tę zaletę, że dokładnie wiesz, gdzie znajdują się adnotacje.

Co do argumentu o istnieje inny sposób to zrobić, można zrobić ten sam argument przeciwko listowych:

out = [] 
for x in my_iterable: 
    out.append(x) 
6

Mają dwie różne role.

Adnotacje są dokumentacją/komentarzem do argumentów podczas przekształcania funkcji przez dekoratora.

Sam w sobie Python nie przywiązuje żadnego konkretnego znaczenia ani znaczenia do adnotacji.

Python Decorators page

dekoratorzy dynamicznie zmieniać funkcjonalność funkcji, sposób, lub klasy bez bezpośrednie użycie podklasy lub zmiany kodu źródłowego funkcja dzone.