La plupart des nouvelles fonctionnalités introduites dans la version 3.0 ont également été rétroportées en 2.6, un choix délibéré. Cependant, ce n'était pas pratique dans tous les cas, donc certaines des nouvelles fonctionnalités sont restées sur Python 3 seulement. Le fonctionnement des métaclasses est probablement la plus grande nouveauté de tous les temps. La syntaxe est nettement meilleure que la cession de __metaclass__
2.*
...:
class X(abase, metaclass=Y):
mais plus important encore, la nouvelle syntaxe signifie que le compilateur connaît le métaclasse à utiliser avant de traiter le corps de la classe, et donc le métaclasse peut enfin influencer la façon dont le corps de la classe est traité - ce n'était pas possible dans 2.*
. Plus précisément, la nouvelle méthode __prepare__
de la métaclasse peut renvoyer tout mappage en écriture, et si c'est le cas, elle est utilisée à la place d'une dict
régulière pour enregistrer les affectations (et affecter des mots clés tels que def
) dans le corps de la classe. En particulier, cela permet au ordre du corps de la classe d'être préservé exactement comme il est écrit, tout en permettant à la métaclasse, si elle le souhaite, d'enregistrer plusieurs affectations/définitions pour n'importe quel nom dans le corps de classe, plutôt que juste la dernière affectation ou définition effectuée pour ce nom. Cela élargit énormément l'applicabilité des classes avec des métaclasses personnalisées appropriées, par rapport à ce qui était réalisable en 2.*
.
Une autre syntaxe biggie est annotations - voir le PEP que je pointe vers les détails. La bibliothèque standard de Python ne donne aucune sémantique spéciale aux annotations, mais précisément parce que les frameworks tiers et les outils sont habilités à appliquer toute la sémantique qu'ils souhaitent - des tâches telles que la vérification de type pour les arguments de fonction sont autorisées, bien qu'elles ne soient pas directement effectuées par bibliothèque Python standard.
Il y a bien sûr beaucoup d'autres (la nouvelle « vue » concept incarné par des méthodes telles que .keys
de dict & c dans 3.*
, uniquement des mots clés arguments, meilleure séquence déballer, nonlocal
pour les fermetures plus puissants, ...), de variant le poids, mais tous très utile et bien conçu.
comment définiriez-vous * complètement nouvelle * fonctionnalité? – SilentGhost
Je viens d'ajouter un peu, merci de le signaler. – Joe
Vote pour fermer aussi large. –