Rozważ następujące:
def some_function():
return 1
def some_generator():
yield 1
W powyższym kodzie some_function
jest funkcja, podczas gdy some_generator
jest generatorem. Wyglądają dość podobnie.
Problem, który mam podczas odczytywania kodu, polega na tym, że muszę skanować każdą linię w „funkcji” w poszukiwaniu yield
słowa kluczowego, zanim będę mógł ustalić, czy jest to faktycznie funkcja, czy generator!
Wydaje mi się po prostu, że użycie innego słowa kluczowego dla generatorów miałoby większy sens, np .:
gen some_generator():
yield 1
Jakie są zalety używania def
słowa kluczowego w przypadku generatorów i funkcji? Dlaczego nowe słowo kluczowe nie zostało wprowadzone do oddzielnych funkcji i generatorów?
design
programming-languages
python
Derek Kwok
źródło
źródło
gen
zamiastdef
nie spowodowałaby, że ta transformacja byłaby znacznie bardziej uciążliwa.Odpowiedzi:
„Jakie są zalety używania słowa kluczowego def zarówno dla generatorów, jak i funkcji?”
Chociaż są one mechanicznie różne, w praktyce, kiedy ich używam, często są dla mnie efektywnie takie same koncepcyjnie (nie myślę dużo o sprawdzaniu
range()
vsxrange()
).Jeśli chodzi o zrozumienie, o co chodzi w tej funkcji szybko, zgadzam się, że coś zostało utracone przy użyciu
def
, ale rzeczy nie powinny być zbyt zaciemnione w funkcji na początku.Nawet domniemane
return None
może mylić zamierzone zachowanie funkcji po długim okresie warunkowym (jak w, byłoreturn None
zamierzone jako zachowanie ostateczne lub niedopatrzenie w logice). Ale to tylko moje przekonania.Nie wydaje mi się jednak, aby mój argument był szczególnie przekonujący, dlatego odłożę się na PEP 255 :
źródło
await
(iasync with
aasync for
) konstrukcje składniowe dodane w PEP 492 , które pracują bardzo podobny doyield from
, wymagają funkcji są one wykorzystywane w celu być zadeklarowane używającasync def
zamiast po prostudef
.Dodanie nowych słów kluczowych grozi zerwaniem istniejących programów. Projektanci języków zwykle starają się unikać dodawania nowych słów kluczowych, szczególnie w przypadku funkcji językowych dodanych po tym, jak język zyskał już na popularności. Każde dodane słowo kluczowe jest identyfikatorem, którego programy nie mogą wykorzystywać do innych celów, więc dodanie słowa kluczowego może potencjalnie uszkodzić istniejące programy. Projektanci języków muszą porównać zalety nowego słowa kluczowego z kosztami.
Wątpię, aby zdefiniowanie osobnego słowa kluczowego dla generatorów przyniosło wiele korzyści. Zrozumienie, czy symbol odpowiada nazwie funkcji, czy nazwie generatora, jest ważne dla dzwoniących, a dzwoniący nie powinni (a czasem nie mogą) patrzeć na to, jakie słowo kluczowe zostało użyte do jego zaimplementowania. Odpowiedzialność za lepsze konwencje nazewnictwa i dokumentację.
źródło
Generatory to funkcje leniwie oceniające. Biorąc pod uwagę, że u podstaw są to samo, sensowne byłoby, gdyby użyli tego samego słowa kluczowego. Jedną z opcji może być użycie komentarza w celu ustalenia, który z nich dla danego wystąpienia:
źródło
Sądzę, że to dlatego, że jest bardziej Pythonic, ale co ja wiem? ;)
Nie sądzę, żeby to miało tak duże znaczenie. Łatwiej mi je zapamiętać, ponieważ nie trzeba ich zapamiętywać.
EDYCJA: PEP może powiedzieć, że możesz to zbadać.
źródło