Wiele całkowicie nowych funkcji wprowadzonych w wersji 3.0 zostało również przeniesionych do wersji 2.6, co jest zamierzonym wyborem. Jednak we wszystkich przypadkach nie było to praktyczne, więc niektóre z nowych funkcji pozostały tylko w Pythonie 3.
Sposób działania metaclasses jest prawdopodobnie największą pojedynczą nową funkcją. Składnia jest wyraźnie lepsza niż 2.*
„s __metaclass__
przypisanie ...:
class X(abase, metaclass=Y):
ale co ważniejsze, nowa składnia oznacza, że kompilator wie metaklasą używać przed przetwarza ciało klasy, a więc może wreszcie metaklasa mieć wpływ na sposób przetwarzania treści klasy - nie było to możliwe w 2.*
. Konkretnie, nowa metoda metaclassu __prepare__
może zwrócić każde zapisywalne odwzorowanie, a jeśli tak, to jest używana zamiast zwykłego dict
do zapisywania przydziałów (i przypisywania słów kluczowych, takich jak def
) przeprowadzanych w ciele klasy. W szczególności pozwala to na zachowanie porządku klasy w końcu dokładnie tak, jak zostało zapisane, jak również pozwala metaclass, jeśli tak zdecyduje, nagrać wiele przypisań/definicji dla dowolnej nazwy w ciele klasy, zamiast tylko ostatnie zadanie lub definicja wykonana dla tej nazwy. To znacznie rozszerza możliwości zastosowania klas z odpowiednimi niestandardowymi metaclasses, w porównaniu do tego, co było możliwe w 2.*
.
Kolejna składnia biggie to annotations - patrz PEP, na który zwracam uwagę, aby poznać szczegóły. Standardowa biblioteka Pythona nie daje żadnej specjalnej semantyki do adnotacji, ale właśnie z tego powodu platformy i narzędzia innych firm są uprawnione do stosowania dowolnej semantyki, którą sobie życzą - takie zadania, jak sprawdzanie typu dla argumentów funkcji, są tutaj dozwolone, ale nie są wykonywane bezpośrednio przez standardowa biblioteka Pythona.
Istnieje oczywiście wiele innych (nowa „widoki” koncepcja zawarta takimi metodami jak DICT na .keys
& c w 3.*
, słów kluczowych, tylko argumenty, lepiej sekwencja rozpakowaniu nonlocal
dla bardziej zaawansowanych zamknięć, ...), z zmienny, ale całkiem niezły i dobrze zaprojektowany.
Jak zdefiniowałbyś * całkowicie nową * funkcję? – SilentGhost
Po prostu dodałem trochę, dziękuję za wskazanie tego. – Joe
Głosowanie za blisko jako zbyt szerokie. –