Was wird in Python 3.9 erwartet?

Die neue Version wird erst im Oktober erwartet, aber Sie können bereits lesen, was uns darin erwartet, und die vorläufige Version testen.
In diesem Artikel ändert sich meiner Meinung nach das Interessanteste.

Zunächst werden wir daran erinnert, dass Ebenen, die die Abwärtskompatibilität mit Version 2.7 unterstützen, langsam entfernt werden und aufgefordert werden, auf DeprecationWarning zu achten und diese zu entfernen. Einige Warnungen bleiben weiterhin bei 3,9, aber es ist besser, sie loszuwerden.

Dictionary
Merge Operator ( PEP-584 ) Bisher gab es verschiedene Möglichkeiten, Wörterbücher zusammenzuführen, aber jedes hatte kleinere Fehler oder Nuancen.
Verschiedene Möglichkeiten, Wörterbücher zu kombinieren
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)

, , , . , - .

Jetzt können Sie einfach schreiben
united_dict = d1 | d2
# ,        ,    update():
d1 |= d2

Daher wird eine neue Möglichkeit, Wörterbücher mit einem Operator zu kombinieren, meiner Meinung nach viele ansprechen.

Vereinfachung von Anmerkungen für Container und andere Typen, die parametrisiert werden können ( PEP-0585 )
Die folgende Neuerung ist sehr nützlich für diejenigen, die Typanmerkungen verwenden.
Vereinfacht jetzt die Annotation von Sammlungen wie Liste und Diktat sowie allgemein parametrisierten Typen.

Für diese Typen wird der Begriff Generisch eingeführt - dies ist ein Typ, der parametrisiert werden kann, normalerweise ein Container. Zum Beispiel diktieren. Und die Frage ist, wie man es richtig übersetzt, damit es nicht die Zähne bricht. Ich möchte das Wort "generisch" wirklich nicht verwenden. In den Kommentaren freue ich mich sehr auf weitere Vorschläge. Vielleicht gab es irgendwo in den Übersetzungen einen besseren Namen?
Parametrisiertes Generikum: dict [str, int].

Für solche Typen müssen Sie jetzt nicht mehr die entsprechenden Anmerkungen aus der Eingabe importieren, sondern können nur noch Typnamen verwenden.
zum Beispiel
# 
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


Für Zeichenfolgen wurden die Methoden removeprefix () und removeesuffix () ( PEP 616 ) angezeigt
. Hier ist alles einfach. Wenn die Zeile mit einem Präfix beginnt, wird die Zeile ohne dieses Präfix zurückgegeben. Wenn das Präfix mehrmals wiederholt wird, wird es nur einmal gelöscht. Ähnliches gilt für das Suffix:
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 '

Aktuelle Alternativen
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',))

, , .

Einige Änderungen im Mathematikmodul
Die Funktion math.gcd () zum Ermitteln des größten gemeinsamen Teilers akzeptiert jetzt eine Liste von Ganzzahlen, sodass Sie einen gemeinsamen Teiler mit mehr als einer Zahl und einer Funktion finden können.
Es gibt eine Funktion zum Bestimmen des kleinsten gemeinsamen Vielfachen von math.lcm () , die auch eine unbegrenzte Anzahl von Ganzzahlen akzeptiert.
Die folgenden zwei Funktionen sind miteinander verbunden.
math.nextafter (x, y) - berechnet die Gleitkommazahl, die x am nächsten kommt, wenn sie sich in y-Richtung bewegt.
math.ulp (x)- steht für "Einheit an letzter Stelle" und hängt von der Genauigkeit der Berechnungen Ihres Computers ab. Bei positiven Zahlen wird der niedrigste Wert der Zahl zurückgegeben, sodass beim Hinzufügen von x + ulp (x) die nächste Gleitkommazahl erhalten wird.
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 

Jetzt kann jeder gültige Ausdruck ein Dekorator sein ( PEP-0614 ).
Die Einschränkung wird von Dekoratoren entfernt, wonach nur ein Name als Dekorator fungieren kann und seine Syntax nur die Trennung durch Punkte zulässt.

Ich glaube nicht, dass viele Leute über die Existenz einer solchen Einschränkung nachgedacht haben, aber die Beschreibung von pep gibt ein Beispiel, wenn eine Innovation den Code schlanker macht. In Analogie können wir zitieren
vereinfachtes und künstliches Beispiel:
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

Die unparse-Methode ( bpo-38870 ) wurde dem ast-Modul hinzugefügt.
Wie der Name schon sagt, kann sie die Quellzeichenfolge mit dem ast.AST-Objekt kompilieren. Einmal wollte ich das sogar verwenden und es war überraschend, dass es keine solche Methode gab.
Beispiel:
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}

Die neue functools.TopologicalSorter-Klasse zum topologischen Sortieren gerichteter azyklischer Graphen ( bpo-17005 ) Der
an den Sortierer übergebene Graph sollte ein Wörterbuch sein, in dem die Schlüssel die Eckpunkte des Graphen sind und der Wert ein iterierbares Objekt mit Vorgängern ist (Eckpunkte, deren Bögen auf den Schlüssel zeigen). Als Schlüssel ist wie üblich jeder Hash-Typ geeignet.
Beispiel:
:

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. , , .

Neue Status , auf die wir so lange gewartet haben, wurden
zu http.HTTPStatus hinzugefügt : 103 EARLY_HINTS
418 IM_A_TEAPOT
425 TOO_EARLY

Und noch ein paar Änderungen:
  • Eingebaute Typen (Bereich, Tupel, Satz, Frozenset, Liste) werden beschleunigt ( PEP-590 )
  • "" .replace ("", s, n) gibt jetzt s, keine leere Zeichenfolge, für alle ungleich Null n zurück. Dies gilt sowohl für Bytes als auch für Bytearray.
  • ipaddress unterstützt jetzt das Parsen von IPv6-Adressen mit Zielen.

Da sich Version 3.9 noch in der Entwicklung befindet und möglicherweise weitere Änderungen hinzugefügt werden, plane ich, diesen Artikel nach Bedarf zu ergänzen.

Sie können ausführlicher lesen:
docs.python.org/3.9/whatsnew/3.9.html
www.python.org/downloads/release/python-390a6
Um nicht zu sagen, dass zukünftige Änderungen das sind, worauf alle lange gewartet haben und ohne welche Es ist unmöglich, durchzukommen, obwohl es einige nette Punkte gibt. Und was fandest du an der neuen Version am interessantesten?

UPD:
Aktualisierter Link zur neuesten Version,
PEP-0585 zur Typanmerkung hinzugefügt

All Articles