Quoi de neuf attendu dans Python 3.9

La nouvelle version n'est attendue qu'en octobre, mais vous pouvez déjà lire ce qui nous y attend et tester la version préliminaire.
Dans cet article, les changements les plus intéressants, à mon avis,.

Tout d'abord, il nous est rappelĂ© que les couches prenant en charge la rĂ©trocompatibilitĂ© avec la version 2.7 sont lentement supprimĂ©es et invitĂ© Ă  prĂȘter attention Ă  DeprecationWarning et Ă  les Ă©liminer. Quelques avertissements resteront toujours Ă  3,9, mais il vaut mieux s'en dĂ©barrasser.

Opérateur de
fusion de dictionnaires ( PEP-584 ) Jusqu'à présent, il y avait plusieurs façons de fusionner des dictionnaires, mais chacun avait des défauts ou des nuances mineures.
Plusieurs façons de combiner des dictionnaires
1. update
d1 = {'one': 1}
d2 = {'two': 2}
#     ,..
d1.update(d2)
# ...  . 
united_dict = d1.copy()
united_dict.update(d2)

2.
united_dict = {**d1, **d2}

, , , .
3. dict(d1, **d2), . , d2 .
4. collections.ChainMap
.
, , .
from collections import ChainMap
d1 = {'one': 1}
d2 = {'two': 2}
united_dict = ChainMap(d1, d2)

, , , . , - .

Vous pouvez maintenant Ă©crire simplement
united_dict = d1 | d2
# ,        ,    update():
d1 |= d2

Ainsi, une nouvelle possibilité de combiner des dictionnaires avec un seul opérateur, je pense, plaira à plusieurs.

Simplification des annotations pour les conteneurs et autres types pouvant ĂȘtre paramĂ©trĂ©s ( PEP-0585 )
L'innovation suivante est trĂšs utile pour ceux qui utilisent l'annotation de type.
Simplifie désormais l'annotation des collections, telles que list et dict, et les types généralement paramétrés.

Pour ces types, le terme gĂ©nĂ©rique est introduit - c'est un type qui peut ĂȘtre paramĂ©trĂ©, gĂ©nĂ©ralement un conteneur. Par exemple, dict. Et la question est de savoir comment le traduire correctement afin qu'il ne se casse pas les dents. Je ne veux vraiment pas utiliser le mot "gĂ©nĂ©rique". Donc, dans les commentaires, j'attends avec impatience d'autres suggestions. Peut-ĂȘtre que quelque part dans les traductions il y avait un meilleur nom?
Générique paramétré: dict [str, int].

Ainsi, pour ces types, vous n'avez plus besoin d'importer les annotations correspondantes de la frappe, mais vous pouvez simplement utiliser des noms de type.
par exemple
# 
from typing import List
List[str]
# 
list[int]

.

:
# 
from typing import OrderedDict
OrderedDict[str, int]
# 
from collections import OrderedDict
OrderedDict[str, int]

tuple # typing.Tuple
list # typing.List
dict # typing.Dict
set # typing.Set
frozenset # typing.FrozenSet
type # typing.Type
collections.deque
collections.defaultdict
collections.OrderedDict
collections.Counter
collections.ChainMap
collections.abc.Awaitable
collections.abc.Coroutine
collections.abc.AsyncIterable
collections.abc.AsyncIterator
collections.abc.AsyncGenerator
collections.abc.Iterable
collections.abc.Iterator
collections.abc.Generator
collections.abc.Reversible
collections.abc.Container
collections.abc.Collection
collections.abc.Callable
collections.abc.Set # typing.AbstractSet
collections.abc.MutableSet
collections.abc.Mapping
collections.abc.MutableMapping
collections.abc.Sequence
collections.abc.MutableSequence
collections.abc.ByteString
collections.abc.MappingView
collections.abc.KeysView
collections.abc.ItemsView
collections.abc.ValuesView
contextlib.AbstractContextManager # typing.ContextManager
contextlib.AbstractAsyncContextManager # typing.AsyncContextManager
re.Pattern # typing.Pattern, typing.re.Pattern
re.Match # typing.Match, typing.re.Match


Pour les chaßnes, les méthodes removeprefix () et removesuffix () ( PEP 616 ) sont apparues
. Tout est simple ici. Si la ligne commence par un prĂ©fixe, la ligne sans ce prĂ©fixe sera renvoyĂ©e. Si le prĂ©fixe est rĂ©pĂ©tĂ© plusieurs fois, il ne sera supprimĂ© qu'une seule fois. De mĂȘme avec le suffixe:
some_str = 'prefix of some string and here suffix'
some_str.removeprefix('prefix')
>> ' of some string and here suffix'
some_str.removesuffix('suffix')
>> 'prefix of some string and here '

Alternatives actuelles
1. , , — removeprefix.
def removeprefix(self: str, prefix: str, /) -> str:
    if self.startswith(prefix):
        return self[len(prefix):]
    else:
        return self[:]

2. lstrip, rstrip:
	'foobar'.lstrip(('foo',))

, , .

Quelques modifications du module mathématique
La fonction math.gcd () pour trouver le plus grand diviseur commun accepte désormais une liste d'entiers, vous pouvez donc trouver un diviseur commun avec plus d'un nombre avec une fonction.
Il existe une fonction pour déterminer le plus petit multiple commun de math.lcm () , qui accepte également un nombre illimité d'entiers.
Les deux fonctions suivantes sont interconnectées.
math.nextafter (x, y) - calcule le nombre à virgule flottante le plus proche de x s'il se déplace dans la direction y.
math.ulp (x)- signifie «Unit in the Last Place» et dépend de la précision des calculs de votre ordinateur. Pour les nombres positifs, la valeur la plus faible du nombre sera renvoyée, de sorte que lorsqu'il est ajouté x + ulp (x), le nombre à virgule flottante le plus proche sera obtenu.
import math

math.gcd(24, 36)
>> 12
math.lcm(12, 18)
>> 36
math.nextafter(3, -1)
>> 2.9999999999999996
3 - math.ulp(3)
>> 2.9999999999999996
math.nextafter(3, -1) + math.ulp(3)
>> 3.0 

DĂ©sormais, toute expression valide peut ĂȘtre un dĂ©corateur ( PEP-0614 ).
La restriction est supprimée des décorateurs, selon laquelle seul un nom peut agir comme décorateur et sa syntaxe autorise uniquement la séparation par des points.

Je ne pense pas que beaucoup de gens aient pensé à l'existence d'une telle restriction, mais la description de pep donne un exemple lorsqu'une innovation rend le code plus mince. Par analogie, on peut citer
exemple simplifié et artificiel:
def a(func):
	def wrapper():
		print('a')
		func()
	return wrapper
	
def b(func):
	def wrapper():
		print('b')
		func()
	return wrapper
	
decorators = [a, b]

@decorators[0] #   3.8        
def some_func():
	print('original')
	
some_func()
>> a
>> original

La méthode unparse ( bpo-38870 ) a été ajoutée au module ast.
Comme son nom l'indique, elle peut compiler la chaĂźne source Ă  l'aide de l'objet ast.AST. Une fois, j'ai mĂȘme voulu l'utiliser et c'Ă©tait surprenant qu'il n'y ait pas une telle mĂ©thode.
Exemple:
import ast
parsed = ast.parse('import pprint; pprint.pprint({"one":1, "two":2})')
unparsed_str = ast.unparse(parsed)
print(unparsed_str)
>> import pprint
>> pprint.pprint({'one': 1, 'two': 2})
exec(unparsed_str)
>> {'one': 1, 'two': 2}

La nouvelle classe functools.TopologicalSorter pour le tri topologique des graphiques acycliques dirigés ( bpo-17005 ) Le
graphique transmis au trieur doit ĂȘtre un dictionnaire dans lequel les clĂ©s sont les sommets du graphique et la valeur est un objet itĂ©rable avec des prĂ©dĂ©cesseurs (sommets dont les arcs pointent vers la clĂ©). Comme clĂ©, comme d'habitude, tout type de hachage convient.
Exemple:
:

from functools import TopologicalSorter
graph = graph = {8: [3, 7], 11: [5, 7], 2: [11], 9: [8, 11], 10: [3, 11]}
t_sorter = TopologicalSorter(graph)
t_sorted_list = list(t_sorted_list.static_order()) #  ,    ,     static_order.
>> [3, 7, 5, 8, 11, 2, 9, 10]


, TopologicalSorter add. , , .

De nouveaux statuts que nous attendions depuis si longtemps ont été
ajoutés à http.HTTPStatus : 103 EARLY_HINTS
418 IM_A_TEAPOT
425 TOO_EARLY

Et quelques autres changements:
  • Les types intĂ©grĂ©s (gamme, tuple, set, frozenset, list) sont accĂ©lĂ©rĂ©s ( PEP-590 )
  • "" .replace ("", s, n) renvoie maintenant s, pas une chaĂźne vide, pour tout n diffĂ©rent de zĂ©ro. Cela est vrai Ă  la fois pour les octets et pour le tableau de distribution.
  • ipaddress prend dĂ©sormais en charge l'analyse d'adresses IPv6 avec des destinations.

Étant donnĂ© que la version 3.9 est toujours en cours de dĂ©veloppement et que d'autres modifications seront peut-ĂȘtre ajoutĂ©es, je prĂ©vois de complĂ©ter cet article si nĂ©cessaire.

Vous pouvez lire plus en détail:
docs.python.org/3.9/whatsnew/3.9.html
www.python.org/downloads/release/python-390a6
En général, pour ne pas dire que les changements futurs sont ce que tout le monde attend depuis longtemps et sans lesquels il est impossible de s'en sortir, bien qu'il y ait de bons points. Et qu'avez-vous trouvé le plus intéressant dans la nouvelle version?

UPD:
lien mis Ă  jour vers la derniĂšre version;
ajout du PEP-0585 sur l'annotation des types

All Articles