Jakich funkcji brakuje Ci ciągle w Pythonie?
Wąż ewoluuje
Python to żywy język - stale rozwijany, aby nadążać za duchem czasu. Python Software Foundation nie tylko wprowadza dodatki do standardowej biblioteki i referencyjnej implementacji CPython, ale także wprowadza nowe funkcje i udoskonalenia do samego języka. Na przykład w Pythonie 3.8 wprowadzono nową składnię przypisań w linii („operator mors”), dzięki której niektóre operacje są bardziej zwięzłe. Twórcy Pythona zostali tu zainspirowani obecnością i użytecznością takiego rozwiązania w innych językach. Ale to tylko przykład jednej z wielu przydatnych funkcji, które można dodać do Pythona, aby uczynić język potężniejszym i stosowanym przez większą liczbę firm.
Czego chcieć więcej? Stałych.
Może na przykład wprowadzenie prawdziwych stałych. Python tak naprawdę nie ma pojęcia stałej wartości. Obecnie stałe w Pythonie są one głównie kwestią konwencji. Używanie nazwy pisanej wielkimi literami i dolnego podkreślnika - np. START_NOW - to wskazówka, że zmienna ma być stałą. Podobnie, adnotacja typing.Final stanowi wskazówkę podczas lintingu (debuggowania), że obiektu nie należy modyfikować. Jednocześnie jednak taka zmienna w ogóle nie jest chroniona przed taką modyfikacją.
Dlaczego tak się dzieje?
Ponieważ zmienność jest głęboko zakorzeniona w konstrukcji Pythona. Kiedy przypisujesz wartość do zmiennej (np. x = 2) to tworzysz nazwę w lokalnej przestrzeni nazw, x i kierujesz ją na obiekt w systemie, który ma wartość całkowitą 2. Python zawsze zakłada, że nazwy są zmienne - każda nazwa może wskazywać na dowolny obiekt. Oznacza to, że za każdym razem, gdy używana jest nazwa, Python zadaje sobie trud sprawdzenia, na jaki obiekt wskazuje. Ta metodologia jest jednym z głównych powodów, dla których Python działa wolniej niż niektóre inne języki. Dynamika Pythona zapewnia dużą elastyczność i wygodę, ale odbywa się kosztem wydajności w czasie wykonywania.
Jedną z zalet posiadania prawdziwych stałych deklaracji w Pythonie byłoby pewne zmniejszenie częstotliwości wyszukiwania obiektów w czasie wykonywania, a tym samym lepsza wydajność. Jeśli podczas wykonywania programu komputer wie z wyprzedzeniem, że dana wartość nigdy się nie zmienia, nie musi sprawdzać powiązań. Mogłoby to również otworzyć drogę do dalszych optymalizacji Pythona przez inne firmy, tak jak to ma miejsce w przypadku systemów generujących kod maszynowy (kompilatorów) z aplikacji Python. Potrafią to na przykład Cython czy Nuitka.
Z drugiej strony prawdziwe stałe byłyby poważną zmianą i najprawdopodobniej rozwiązaniem wstecznie niekompatybilnym. Byłoby również przedmiotem dyskusji, czy stałe pojawiłyby się za pomocą nowej składni - na przykład jeszcze nieużywanego symbolu $ - lub jako rozszerzenie istniejącego sposobu deklarowania nazw w Pythonie.
Może więc kiedyś zobaczymy prawdziwe stałe w Pythonie, ale byłaby to poważna, wręcz przełomowa zmiana.
Wielowierszowe lambdy
Lambdy, czyli funkcje anonimowe, trafiły do Pythona dopiero po pewnym oporze ze strony twórcy języka Guido van Rossuma. Mimo, że lambdy wprowadzono to są one mocno ograniczone: pozwalają na użycie tylko jednego wyrażenia jako treści funkcji. Jeśli chcesz mieć pełny blok instrukcji to musisz je rozdzielić je i utworzyć z nich nową funkcję.
Powodem takiego ograniczenia jest składnia języka a w zasadzie zastosowany model wcięć. Innymi słowy, problem nie jest techniczny, ale chodzi zwyczajnie o brak składni dla wielowierszowych lambd. Prawdopodobnie nie ma sposobu, aby elegancko wprowadzić wielowierszowe funkcje anonimowe bez tworzenia specjalnego przypadku i niejako wyjątku od utrwalonych zasad pisania programów w Pythonie.