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 defusion 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 dictionnaires1. 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 simplementunited_dict = d1 | d2
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 actuelles1. , , â 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ématiqueLa 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 citerexemple 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 ) Legraphique 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_HINTS418 IM_A_TEAPOT425 TOO_EARLYEt 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.htmlwww.python.org/downloads/release/python-390a6En 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