Auparavant, j'ai écrit un article Quoi de neuf en Python 3.5, mais depuis la sortie de la version alpha de 3.6, je vais anticiper les fonctionnalités de 3.6. Je vais le vérifier.
Selon la feuille de route de développement (PEP-494)
--3.6.0 alpha 1: 2016-05-17 (Terminé) --3.6.0 alpha 2: 13/06/2016 (Terminé) --3.6.0 alpha 3: 11/07/2016 (Terminé) --3.6.0 alpha 4: 2016-08-15 (Terminé) --3.6.0 beta 1: 2016-09-12 (Complété et ajouté de nouvelles fonctions jusqu'à ici)
La destination est encore longue. La version finale sortira le 16 décembre. Avant Noël. De nouvelles fonctionnalités continueront d'être ajoutées jusqu'à la version bêta de septembre, donc je pense que cela changera régulièrement d'ici là, mais je mettrai à jour cet article chaque fois qu'il y aura un changement. C'est plus facile que de tout voir en même temps (^^;
Donc, j'ai fait référence à 3.6.0b1 cette fois, et j'ai fait référence au projet de document de version de ici.
Utilisez pyenv pour essayer
pyenv install 3.6.0b1
pyenv local 3.6.0b1
S'il vous plaît.
2016.07.16
2016.10.01
--global
et nonlocal
doivent être placés avant la première utilisation de la variable dans cette portée (auparavant uniquement des avertissements)
_
dans un littéral numérique.PEP-498, PEP-515 et PEP-526 sont mentionnés plus en détail dans "Nouvelles fonctionnalités".
--Sous Linux, os.urandom () se bloquera maintenant jusqu'à ce que le pool d'entropie urandom du système soit initialisé. Voir PEP524 (https://www.python.org/dev/peps/pep-0524/) pour une justification détaillée.
hashlib
et ssl
prennent en charge OpenSSL 1.1.0ssl
plus sûrshashlib
prend en charge les nouvelles fonctions de hachage (BLAKE2, SHA-3, SHAKE) et la fonction de dérivation de cléscrypt ()
--PEP529 (https://www.python.org/dev/peps/pep-0529/) Changement du codage du système de fichiers Windows en UTF-8 --PEP528 (https://www.python.org/dev/peps/pep-0528/) Changement de l'encodage de la console Windows en UTF-8
python.exe
et pythonw.exe
prennent désormais en charge les chemins longs, supprimant la limite de 260 caractères sur les chemins de fichiers.._pth
.
--Si PYTHONHOME
n'est pas défini dans la variable d'environnement, il sera maintenant deviné à l'emplacement de Python36.zip
.--PEP-520 (https://www.python.org/dev/peps/pep-0520/) Conserve l'ordre de définition des attributs de classe --PEP-468 (https://www.python.org/dev/peps/pep-0468/) Conserver l'ordre des arguments de mot-clé
_
dans un littéral numériqueVous pouvez maintenant écrire «1000000000000000» comme «1_000_000_000_000_000». C'est juste _
pour la lisibilité, sans changement sémantique.
L'évaluation des objets frame n'a pas pu être personnalisée jusqu'à présent, mais nous avons ajouté une API de niveau C pour le rendre possible. Cela semble faciliter la mise en œuvre de JIT et du débogueur.
Dans le passé, les chemins du système de fichiers étaient de type "str" ou "bytes", et les bibliothèques qui gèrent les chemins, y compris ceux du standard Python, étaient créées avec cette hypothèse. Cela rendait difficile l'utilisation d'une bibliothèque de représentation de chemin en combinaison avec une bibliothèque existante, telle que pathlib. ..
Pour résoudre ce problème, nous avons défini une interface (classe de base virtuelle) appelée ʻos.PathLike. L'objet qui représente le chemin en hérite, et en définissant une méthode appelée
fspath ()` qui renvoie une représentation sous forme de chaîne du chemin, les autres bibliothèques le reconnaîtront comme le chemin et fonctionneront. C'était.
Préfixez la chaîne avec «f» pour en faire une chaîne formatée. Similaire au format str.format, mais la partie délimitée par «{» et «}» est remplacée en tant que variable. Par exemple, comme ça.
>>> name = "Monty Python"
>>> f"mon nom est{name}est"
'Je m'appelle Monty Python'
C'est à ce moment que str.format est utilisé
>>> "mon nom est{name}est".format(name=name)
Ou
>>> "mon nom est{}est".format(name)
Je devais le faire, donc cela semble un peu plus facile à décrire.
Python est un langage typé dynamiquement sans typage explicite, mais il a le problème qu'il est difficile d'effectuer une analyse statique. Afin de résoudre ce problème, PEP-484 (https://www.python.org/dev/peps/pep-0484/) a proposé une méthode d'ajout d'informations de type à l'argument de la fonction, et en Python 3.5 Introduit.
Cette modification a été étendue pour permettre aux variables (y compris les variables de classe et les variables d'instance) d'avoir des informations de type. Dans le passé, il était possible de faire de même en utilisant des commentaires, mais la différence est que cela était géré en modifiant la grammaire. Par exemple, comme ça.
from typing import List, Dict
primes: List[int] = [] #Un exemple de type de liste d'entiers, l'initialisation avec une liste vide
captain: str #Type de chaîne. Exemple de non initialisation
class Starship:
stats: Dict[str, int] = {} #Exemple de variables de classe. Type de dictionnaire qui prend une chaîne de caractères comme clé et un entier comme valeur
Notez que cette annotation de type ne change pas le comportement et que l'attribution d'une valeur d'un type différent ne provoque pas d'erreur. Il s'agit simplement d'un "indice" pour les informations de type, et est destiné à une analyse statique basée sur ces informations.
Dans le passé, lors du passage de chemins à l'aide d'octets sous Windows, une perte de données pouvait se produire. À partir de Python 3.6, même si vous utilisez Bytes, il sera encodé et renvoyé avec l'encodage par défaut du système. Le codage par défaut est UTF-8 jusqu'à présent, mais il peut éventuellement changer en fonction des commentaires pendant la période bêta.
Lorsqu'une classe est héritée, une méthode de classe appelée __init_subclass__ (cls)
sera appelée. Vous pouvez y écrire du code personnalisé. De plus, lors de l'initialisation de l'objet descripteur, une méthode appelée «set_name» sera appelée.
Il accepte désormais tous les caractères Unicode et peut être lu correctement dans un objet str. Et le codage par défaut de sys.stdin
, sys.stdout
, sys.stderr
est UTF-8.
En entrant une valeur dans une variable d'environnement appelée PYTHONMALLOC, vous pouvez modifier le comportement de l'allocation de mémoire de Python ou définir un hook pour le débogage.
PYTHONMALLOC=debug Avec ce paramètre, les fonctions de débogage suivantes sont activées.
0xCB
0xDB
--Une utilisation illégale de l'API d'allocation de mémoire est détectée. Par exemple, lorsque la zone prise par PyMem_Malloc ()
est libérée par PyObject_Free ()
.
--Détecte lors de l'écriture avant la zone allouée (buffer underflow) ou après l'écriture (buffer overflow).
--Vérifiez si GIL (Global Interpreter Lock) est sécurisé lorsque la fonction d'allocation de mémoire est appelée.PYTHONMALLOC=malloc
Ce paramètre force l'utilisation de malloc
de la bibliothèque C. Cela vous permet d'utiliser des outils externes tels que Valgrind.
PYTHONMALLOC=malloc_debug Combinaison des deux ci-dessus
Lors de la compilation avec --with-dtrace
, les marqueurs qui détectent les événements suivants sont activés.
Cette fonctionnalité vous permet de déboguer et de profiler Python sans avoir à le recompiler pour le débogage.
Les attributs de classe sont conservés dans l'attribut «__dict __» de la classe dans l'ordre dans lequel ils apparaissent dans le code source.
Les arguments de mot-clé de la fonction sont passés à «** kwargs» dans un ordre préservé.
Introduction d'une version mise à jour uniquement lorsque des modifications sont apportées aux objets du dictionnaire. En conséquence, diverses optimisations (améliorations des performances) peuvent être effectuées.
dict ()
utilise maintenant la représentation compacte dérivée de PyPy et utilise 20 à 25% de mémoire en moins que Pythono 3.5. Et l'ordre des arguments de mot-clé dans PEP-468 est implémenté en utilisant ceci. D'autre part, la propriété que «l'ordre est préservé» dépend de l'implémentation et peut changer à l'avenir, l'implémentation ne doit donc pas être basée sur cette hypothèse.
Les longues répétitions de retraçage sont désormais omises
--ʻImportrenvoie maintenant
ModuleNotFoundError` si le module est introuvable
(Aucun pour l'instant)
asyncio Comme asyncio est défini comme "provisoire", toutes les modifications seront également rétroportées vers 3.5.x.
Les principaux changements par rapport à la version 3.5.0 sont les suivants.
--ʻEnsure_future () `Les fonctions et fonctions qui les utilisent peuvent désormais spécifier toutes sortes d'objets attendus comme arguments.
run_coroutine_threadsafe ()
, a été introduite pour permettre à d'autres threads de soumettre des collouts dans la boucle d'événements.Transport.is_closing ()
pour vérifier si le transport est fermé (ou en cours de fermeture).loop.create_server ()
peut maintenant prendre une liste d'hôtes comme argument.loop.create_future ()
a été ajoutée pour vous permettre de créer des objets Future. Cela permet des implémentations alternatives de boucle d'événements et fournit une asyncio.Future plus rapide.loop.get_exception_handler ()
pour obtenir le gestionnaire d'exceptions actuel.
--timeout ()
Le gestionnaire de contexte facilite l'application du code de traitement du délai d'expiration.StreamReader.readuntil ()
pour lire les flux délimités par des octets de séparation.loop.getaddrinfo ()
a été améliorée pour que vous n'ayez pas à appeler getaddrinfo
côté OS si l'adresse a déjà été résolue.Je n'ai pas beaucoup utilisé asyncio, mais j'ai essayé d'utiliser run_coroutine_threadsafe ()
.
asyncio_test.py
import asyncio
@asyncio.coroutine
def wakeup(name, repeat):
for i in range(repeat):
yield from asyncio.sleep(1)
print("{}/{}:Se réveille!".format(name, i))
return repeat
def target(name, repeat, loop):
future = asyncio.run_coroutine_threadsafe(wakeup(name, repeat), loop)
return future.result()
loop = asyncio.get_event_loop()
futures = [
loop.run_in_executor(None, target, "A", 1, loop),
loop.run_in_executor(None, target, "B", 2, loop),
loop.run_in_executor(None, target, "C", 3, loop),
]
loop.run_until_complete(asyncio.wait(futures))
loop.close()
C'est un peu déroutant, mais le collout qui «réveille» s'exécute. Après avoir dormi pendant 1 seconde, imprimez simplement la ligne "Wake up!" Avec le nom donné par name
. Répétez-le autant de fois que l'autre argument «répéter». La fonction appelée target
exécute le collout et y appelle run_coroutine_threadsafe
. Je l'exécute avec run_in_executor
pour l'exécuter dans un thread séparé.
Le résultat de l'exécution devrait ressembler à ceci.
$ python asyncio_test.py
A/0:Se réveille!
B/0:Se réveille!
C/0:Se réveille!
B/1:Se réveille!
C/1:Se réveille!
C/2:Se réveille!
Comme mentionné ci-dessus, ce changement asyncio a été rétroporté sur la série 3.5, et il semble qu'il ait déjà été implémenté dans 3.5.1. En fait, l'exemple ci-dessus fonctionne très bien.
contextlib
Contextlib.AbstractContextManager
a été ajouté comme classe de base virtuelle pour les gestionnaires de contexte afin de fournir des implémentations par défaut pour __enter__ () ʻet
exit ()`. Une classe similaire a également été ajoutée au module de saisie.
venv
venv accepte maintenant le paramètre --prompt
. Cela vous permet de modifier le préfixe de l'invite de ligne de commande dans un environnement virtuel.
datetime
Les méthodes datetime.strftime ()
et date.strftime ()
prennent désormais en charge ISO 8601 % G
,% u
et % V
. % G et% V représentent l'année et le numéro de la semaine (01-53) en notation hebdomadaire, et% u représente le numéro de la semaine (lundi est 1 et dimanche est 7).
distutils.command.sdist L'attribut default_format a été supprimé de distutils.command.sdist.sdist et l'attribut par défaut est maintenant ['gztar']. De manière inattendue, tout code qui dépend de cet attribut doit être corrigé.
email La nouvelle API de messagerie avec l'argument de stratégie ajouté n'est plus «provisoire» et la documentation a été réécrite autour d'elle. La documentation traditionnelle reste une API héritée.
Les classes ʻEmail.mime et
DecodedGenerator` acceptent maintenant les arguments de politique.
Un attribut message_factory
a été ajouté à l'objet de stratégie pour permettre à l'analyseur de spécifier la classe de message à utiliser lors de la génération d'un nouveau message.
encodings
Ajout de 'oem'
pour utiliser CP_OEMCP
sur l'environnement Windows. De plus, un alias ʻansi a été ajouté à
mbcsqui utilise
CP_ACP`.
faulthandler Installe désormais des gestionnaires qui déclenchent des exceptions Windows dans un environnement Windows.
hashlib hashlib prend désormais en charge OpenSSL 1.1.0. La version recommandée est 1.0.2 ou supérieure, mais elle a également été testée avec 0.9.8zc, 0.9.8zh, 1.0.1t et LibreSSL 2.3, 2.4.
Le support de la fonction de hachage BLAKE2 a été ajouté, et blake2b () et blake2s () sont maintenant disponibles.
Les fonctions de hachage SHA-3 sha3_224 (), sha3_256 (), sha3_384 (), sha3_512 () et SHAKE Les fonctions de hachage shake_128 (), shake_256 () ont été ajoutées.
Activé lorsque la fonction de dérivation de clé basée sur un mot de passe scrypt () est OpenSSL 1.1.0 ou supérieur.
http.client
HTTPConnection.request () et endheaders () prennent désormais en charge l'encodage fragmenté dans le corps de la requête.
Le package idlelib a été remanié de manière moderne pour améliorer l'apparence, l'opérabilité et la visibilité d'IDLE. Les modifications incluent la modification du nom de fichier et le code jusqu'à 3,5 ne fonctionnera pas tel quel.
importlib
Puisque ʻimportlib.util.LazyLoader appelle maintenant
create_module () ʻ sur le chargeur d'encapsuleur, ʻimportlib.machinery.BuiltinImporter et ʻimportlib.machinery.ExtensionFileLoader
sont ensemble avec ʻimportlib.util.LazyLoader`. Il n'y a plus de restriction pour laquelle il ne peut pas être utilisé.
ʻImportlib.util.cache_from_source () , ʻimportlib.util.source_from_cache ()
, ʻimportlib.util.spec_from_file_location () `peuvent désormais recevoir des objets de type chemin.
json
json.load ()
et json.loads ()
peuvent maintenant accepter des binaires comme entrée. Le JSON encodé doit être encodé en UTF-8, UTF-16 ou UTF-32.
os
Une méthode close ()
a été fournie pour fermer explicitement l'itateur scandir ()
. Et l'itérateur scandir ()
prend désormais en charge le protocole du gestionnaire de contexte. Si l'itérateur scandir ()
n'est pas épuisé ou explicitement fermé, une exception ResourceWarning
est déclenchée dans le destructeur. Je pense que c'est une contre-mesure de fuite de mémoire, mais si vous l'utilisez avec l'instruction with, elle sera appelée automatiquement.
L'appel système Linux getrandom ()
est maintenant disponible via la nouvelle fonction os.getrandm ().
pickle
Vous pouvez maintenant saler (pickle) les objets qui devaient être appelés __new__
avec des arguments de mot-clé. Cela était possible avec la version 4 ou supérieure de pickle, mais avec ce changement, c'est désormais possible avec la version 3 ou inférieure.
re
Ajout de qualificatifs pour les expressions régulières. Par exemple, (? I: p) ython'` correspond à`'python'` et à
Python' mais pas à
'PYTHON'`. De même, (? I) g (? -I: v) r '' correspond à
GvR '' et gvr '' mais pas à
GVR ''.
readline
set_auto_history ()
a été ajouté pour contrôler si oui ou non il est automatiquement ajouté à l'historique.
rlcompleter rlcompleter est une complétion de readline. Le premier changement consiste à supprimer les variables de module, les méthodes et les attributs commençant par un trait de soulignement ('_') de la liste des complétions. C'est difficile à comprendre, alors voici un exemple. Auparavant, lorsque je démarrais Python en mode interactif, tapais "int". Et puis appuyais deux fois sur la touche TAB, cela se produisait.
$ python
Python 3.5.2 (default, Jul 7 2016, 23:37:57)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> int.<TAB><TAB>
int.__abs__( int.__dir__( int.__hash__( int.__mul__( int.__reduce__( int.__rtruediv__( int.__xor__(
int.__add__( int.__divmod__( int.__index__( int.__name__ int.__reduce_ex__( int.__rxor__( int.bit_length(
int.__and__( int.__doc__ int.__init__( int.__ne__( int.__repr__( int.__setattr__( int.conjugate(
int.__base__( int.__eq__( int.__instancecheck__( int.__neg__( int.__rfloordiv__( int.__sizeof__( int.denominator
int.__bases__ int.__flags__ int.__int__( int.__new__( int.__rlshift__( int.__str__( int.from_bytes(
int.__basicsize__ int.__float__( int.__invert__( int.__or__( int.__rmod__( int.__sub__( int.imag
int.__bool__( int.__floor__( int.__itemsize__ int.__pos__( int.__rmul__( int.__subclasscheck__( int.mro(
int.__call__( int.__floordiv__( int.__le__( int.__pow__( int.__ror__( int.__subclasses__( int.numerator
int.__ceil__( int.__format__( int.__lshift__( int.__prepare__( int.__round__( int.__subclasshook__( int.real
int.__class__( int.__ge__( int.__lt__( int.__qualname__ int.__rpow__( int.__text_signature__ int.to_bytes(
int.__delattr__( int.__getattribute__( int.__mod__( int.__radd__( int.__rrshift__( int.__truediv__(
int.__dict__ int.__getnewargs__( int.__module__ int.__rand__( int.__rshift__( int.__trunc__(
int.__dictoffset__ int.__gt__( int.__mro__ int.__rdivmod__( int.__rsub__( int.__weakrefoffset__
>>> int.
Ce sera comme ça à partir de la version 3.6.
ython 3.6.0a3 (default, Jul 16 2016, 00:35:58)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> int.
int.bit_length( int.conjugate( int.denominator int.from_bytes( int.imag int.mro( int.numerator int.real int.to_bytes(
Les noms commençant par «» sont exclus des candidats à l'achèvement. Si vous voulez les voir, tapez «» puis «
>>> int.__
int.__abs__( int.__dict__ int.__getattribute__( int.__lt__( int.__prepare__( int.__ror__( int.__subclasscheck__(
int.__abstractmethods__ int.__dictoffset__ int.__getnewargs__( int.__mod__( int.__qualname__ int.__round__( int.__subclasses__(
int.__add__( int.__dir__( int.__gt__( int.__module__ int.__radd__( int.__rpow__( int.__subclasshook__(
int.__and__( int.__divmod__( int.__hash__( int.__mro__ int.__rand__( int.__rrshift__( int.__text_signature__
int.__base__( int.__doc__ int.__index__( int.__mul__( int.__rdivmod__( int.__rshift__( int.__truediv__(
int.__bases__ int.__eq__( int.__init__( int.__name__ int.__reduce__( int.__rsub__( int.__trunc__(
int.__basicsize__ int.__flags__ int.__instancecheck__( int.__ne__( int.__reduce_ex__( int.__rtruediv__( int.__weakrefoffset__
int.__bool__( int.__float__( int.__int__( int.__neg__( int.__repr__( int.__rxor__( int.__xor__(
int.__call__( int.__floor__( int.__invert__( int.__new__( int.__rfloordiv__( int.__setattr__(
int.__ceil__( int.__floordiv__( int.__itemsize__ int.__or__( int.__rlshift__( int.__sizeof__(
int.__class__( int.__format__( int.__le__( int.__pos__( int.__rmod__( int.__str__(
int.__delattr__( int.__ge__( int.__lshift__( int.__pow__( int.__rmul__( int.__sub__(
>>> int.__
Ensuite, après avoir complété certains mots-clés, un espace ('') ou un signe deux-points (':') a été ajouté. Par exemple, si vous tapez wi
et appuyez sur <TAB>
, il sera complété paravec
avec un espace, et si vous tapez tr
,<TAB>
donneratry:
. Pratique pour la sobriété.
De plus, on dit qu'il est devenu possible de compléter des attributs créés avec @ property
qui n'ont pas été affichés jusqu'à présent, mais je n'en étais pas sûr.
site Je vérifie les doublons lors de l'ajout d'un chemin vers sys.path, mais cela semble être une solution si cela ne fonctionne pas.
sqlite3
sqlite3.Cursor.lastrowid
renvoie l'ID de colonne de la dernière colonne modifiée, qui n'était valide que lorsque INSERT a été exécuté jusqu'à présent, mais maintenant il peut être obtenu lorsque REPLACE est exécuté.
socket
Vous pouvez maintenant utiliser SIO_LOOPBACK_FAST_PATH
avec la fonction ʻioctl ()` pour améliorer les performances de bouclage TCP dans les environnements Windows (Win8 et plus).
Les constantes getsockopt () «SO_DOMAIN», «SO_PROTOCOL», «SO_PEERSEC» et «et SO_PASSSEC» sont désormais prises en charge.
La famille d'adresses AF_ALG est désormais prise en charge et l'API Crypto du noyau Linux est désormais disponible.
socketserver
Les serveurs basés sur le module socketserver (tel que défini dans http.server
, xmlrpc.server
et wsgiref.simple_server
) supportent désormais le protocole du gestionnaire de contexte.
Implémentation de l'interface writable
où l'attribut wfile
de la classe StreamRequestHandler
est ʻio.BufferedIOBase. En particulier,
write ()` est maintenant garanti d'envoyer toutes les données.
ssl ssl prend désormais en charge OpenSSL 1.1.0. La version recommandée est 1.0.2 ou supérieure, mais elle a également été testée avec 0.9.8zc, 0.9.8zh, 1.0.1t et LibreSSL 2.3, 2.4.
3DES a été supprimé de la suite de chiffrement par défaut. De plus, la suite cryptographique ChaCha20 Poly1305 est maintenant au bon endroit.
La configuration par défaut de SSLContext utilise désormais de meilleures options et de meilleurs chiffrements.
Les sessions SSL peuvent désormais être copiées du côté client vers l'autre côté à l'aide de SSLSession. Amélioration de la vitesse de reprise des sessions TLS.
Toutes les constantes et tous les indicateurs ont été modifiés d'IntEnum en IntFlags.
Les protocoles côté serveur uniquement et côté client uniquement ont été ajoutés en tant que paramètres à transmettre lors de la création d'un SSLContext.
La saisie de l'ID de ressource générale dans la zone d'extension d'alias d'objet ne provoque plus d'erreur système.
subprocess
Un processus enfant créé avec subprocess.Popen
déclenche maintenant une exceptionResourceWarning
lorsqu'il tente d'effacer un objet Popen pendant son exécution.
telnetlib
Telnet
implémente le protocole du gestionnaire de contexte.
tkinter
Ajout de la méthode trace_add ()
trace_remove ()
trace_info ()
à la classe tkinter.Variable
pour remplacer l'implémentation qui utilisait l'ancienne API Tcl.
traceback Les longues répétitions de trace sont désormais omises. Par exemple, si vous exécutez une fonction auto-bouclée, elle ressemblera à ceci.
>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
[Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
typing
Ajout de la classe typing.ContextManager
pour contextlib.AbstractContextManager
(comme mentionné ci-dessus).
unicodedata La base de données interne a été mise à niveau vers Unicode 9.0.0.
unittest.mock
Mock.assert_called ()
et Mock.assert_called_once ()
ont été ajoutés à la classe Mock
pour vous permettre de voir si un objet fictif a été appelé.
urllib.request Si la requête HTTP a un fichier ou un corps répétable (sauf pour les objets byte) mais que l'en-tête Content-length n'est pas spécifié, il s'agissait auparavant d'une erreur, mais désormais envoyée avec un codage de transfert Chunked. Devenu.
urllib.robotparser
RobotFileParser
prend désormais en charge les extensions Crawl-delay
et Request-rate
. Ceux-ci sont utilisés dans le fichier robots.txt pour ajuster l'intervalle d'exploration.
--Crawl-delay: Temps (secondes) à attendre avant de commencer l'exploration
--Request-rate: nombre de pages qui peuvent être demandées dans un certain laps de temps
warnings
Le paramètre source
a été ajouté à la fonction warnings.warn_explicit ()
pour afficher l'objet qui a provoqué le ResourceWarning
. L'attribut source
a également été ajouté à warnings.WarningMessage
.
Ensuite, lorsque ResourceWarning monte, tracemalloc est utilisé, et il est maintenant possible de retracer la mémoire de l'objet à effacer. Un tel exemple est donné.
example.py
import warnings
def func():
return open(__file__)
f = func()
f = None
Le fichier est ouvert dans la fonction func
, et immédiatement après cela, la référence à l'objet fichier est écrasée par NULL pour le couper. Lorsque vous faites cela, cela ressemble à ceci.
$ python -Wd -X tracemalloc=5 example.py
example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
f = None
Object allocated at (most recent call first):
File "example.py", lineno 4
return open(__file__)
File "example.py", lineno 6
f = func()
winreg Le module winreg qui manipule le registre dans l'environnement Windows prend désormais en charge le type REG_QWORD d'entier 64 bits.
winsound Vous pouvez désormais transmettre des arguments de mot-clé avec Beep, MessageBeep et PlaySound.
xmlrpc.client Prend en charge les nouveaux types numériques et la suppression de `` None '' dans l'implémentation Apache XML-RPC
zipfile
Une méthode de classe appelée ZipInfo.from_file ()
a été ajoutée pour vous permettre de créer un objet ZipInfo en spécifiant un nom de fichier, et la méthode ZipInfo.is_dir ()
peut être utilisée pour vérifier s'il s'agit d'un répertoire. C'était. Et ZipFile.open ()
peut maintenant être utilisé non seulement pour récupérer des données à partir de fichiers ZIP, mais aussi pour y écrire.
zlib
La fonction compress ()
peut maintenant spécifier level
comme argument de mot-clé.
fileinput
Vous pouvez maintenant spécifier un gestionnaire d'erreurs ainsi que l'encodage utilisé lors de l'ouverture d'un fichier avec hook_encoded ()
. Voir le paramètre ʻerrorsdans ʻopen ()
pour plus de détails.
surrogateescape
ʻignore`` replace`.
replace surrogateescape
surrogatepass`.
replace`` surrogate escape. --bytes% args est maintenant jusqu'à 2 fois plus rapide. --bytearray% args est maintenant 2,5 à 5 fois plus rapide. --
bytes.fromhex () et
bytearray.fromhex () sont maintenant 2 à 3,5 fois plus rapides. --
bytes.replace (b '', b '.') Et
bytearray.replace (b '', b '.') Sont jusqu'à 80% plus rapides. --PyMem_Malloc () utilise maintenant pymalloc au lieu de malloc dans la bibliothèque C pour l'allocation de mémoire de domaine. pymalloc est optimisé pour les objets de courte durée de 512 octets ou moins, et malloc est utilisé pour allouer des blocs plus grands. --
pickle.load () et
pickle.loads () `sont maintenant jusqu'à 10% plus rapides lors du chargement d'un grand nombre de petits objets.--with-optimisation
à l'indicateur de configuration. Si spécifié, la prise en charge de la génération LTO (Link Time Optimization) et PGO (Profile-Guided Optimization) sera activée.Py_FinalizeEx ()
a été introduite pour vous indiquer si le processus de terminaison de l'interpréteur a réussi (s'il y a eu une erreur lors du traitement de fin).
--PyArg_ParseTupleAndKeywords ()
prend désormais en charge les arguments de position uniquement.
--PyTrackback_Print
s'affiche maintenant sans itérations longues.L'option --with-system-ffi
est activée par défaut sur les plates-formes autres que OSX. Il peut être désactivé avec --without-system-ffi
, mais l'utilisation de cet indicateur n'est plus possible depuis Python 3.7. OSX n'est pas affecté par ce changement.
L'utilisation de ʻasync et ʻawait
comme noms de variables, noms de classes, noms de fonctions et noms de modules est obsolète. Introduits dans Python 3.5 par PEP-492, ʻasync et ʻawait
seront des mots-clés officiels dans Python 3.7.
--importlib.machinery.SourceFileLoader.load_module () importlib.machinery.SourcelessFileLoader.load_module () est obsolète.
pyvenv
sera obsolète. La spécification python3 -m venv
est recommandée à la place__spec__
ou __package__
n'est pas défini lors de l'importation relative.dbm.dumb
était toujours ouvert et modifiable, et a été créé s'il n'existait pas. Ce comportement a été déconseillé pour correspondre aux autres implémentations de dbm et ne sera pas disponible dans Python 3.8.(? Letters)
ne peut désormais être utilisé qu'au début d'une expression régulière.certfile
, keyfile
et check_hostname
sont utilisés dans ftplib, http.client, imaplib, poplib, smtplib, etc., mais ils sont obsolètes. On s'attend à utiliser context
à la place.
--Plusieurs protocoles et fonctions du module ssl sont obsolètes. Ceux qui ne seront plus OpenSSL à l'avenir, ou ceux pour lesquels d'autres alternatives ont été fournies.--ʻInspect.getmoduleinfo () a été supprimé. Utilisez ʻinspect.getmodulename ()
pour trouver le nom de module d'un chemin.
traceback.Ignore
et la méthode traceback.usage
traceback.modname`` traceback.fullmodname`` traceback.find_lines_from_code`` traceback.find_lines
traceback.find_strings`` traceback.find_executable_lines
sont supprimées du module de traceback. C'était. Ce sont des candidats obsolètes de 3.2, et des fonctions similaires sont fournies par des méthodes privées.
--tk_menuBar () `` tk_bindForTraversal ()
La méthode factice a été supprimée de la classe de widget tkinter.de la classe
zipfile.ZipFile a supprimé le support du mode "U". Comme alternative, utilisez ʻio.TextIOWrapper
pour lire le fichier compressé.Voici quelques éléments à garder à l'esprit lors du portage de votre code vers Python 3.6.
--COUNT_ALLOCS`` SHOW_ALLOC_COUNT
SHOW_TRACK_COUNT
La sortie Python construite en définissant des macros est désactivée par défaut. Pour activer cela, ajoutez -X showalloccount
à l'argument et démarrez Python. De plus, la destination de sortie est passée de stdout à stderr.
--PyMem_Malloc ()
L'allocation de mémoire utilise maintenant pymalloc au lieu de system maloc, donc les applications qui appellentPyMem_Malloc ()
sans prendre de GIL planteront. Vous pouvez vérifier l'allocation de mémoire en définissant la variable d'environnement PYTHONMALLOC
sur debug
.
--Py_Exit ()
(et l'interpréteur principal) renvoie désormais 120 si la libération de mémoire à la sortie échoue.
J'allais jeter un rapide coup d'œil aux changements, mais au fur et à mesure que je les examinais, divers points intéressants sont ressortis et cela a pris plus de temps que prévu. Pour l'instant, il n'y a pas d'autre changement dans b1 par définition, j'ai donc supprimé "(version α3)" du titre. La finale de la version 3.6 est prévue pour la mi-décembre, il se peut donc qu'il y ait à nouveau des changements, mais je la mettrai à jour de temps en temps.
Recommended Posts