Changements entre Python 2.x.x et Python 3.x.x et comment convertir Python 2.x.x en Python 3.x.x

Créé le: 2016-10-09 12:36:49, Mis à jour le: 2017-10-11 10:18:05
comments   2
hits   4963

tôt qu’un ensemble vide.

Les scripts 2to3 ne corrigent pas les valeurs littérales de set[…] par défaut. Pour activer cette fonctionnalité, spécifiez le paramètre -f set_literal lors de l’appel 2to3 sur la ligne de commande.

Notes Before After
set([1,2,3]) {1,2,3}
set((1,2,3)) {1,2,3}
set([i for iin a_sequence]) {i for iin a_sequence}
  • #### Buffer de fonction globale

Les objets Python implémentés en C exportent une interface de zone tampon qui permet à d’autres codes Python de lire et d’écrire directement sur un bloc de mémoire. Cela sonne fort, mais c’est aussi effrayant. Dans Python 3, le buffer a été renommé memoryview. Les modifications réelles sont plus complexes, mais vous pouvez presque ignorer ces différences.

Les scripts 2to3 ne corrigent pas par défaut la fonction buffer (). Pour activer cette fonction, spécifiez le paramètre -f buffer lors de l’appel 2to3 sur la ligne de commande.

Notes Before After
x =buffer(y) x =memoryview(y)
  • #### Les espaces autour de la virgule (explicite)

Bien que Python soit très strict sur les espaces pour indenter et sortir, il est assez libre d’utiliser les espaces dans d’autres domaines. Dans les listes, les sous-ensembles, les ensembles et les dictionnaires, les espaces peuvent apparaître devant ou derrière les virgules, ce qui n’a pas de mauvais effet. Cependant, le manuel de style de code Python indique qu’il ne peut pas y avoir d’espaces avant les virgules et qu’il devrait y en avoir après les virgules.

Les scripts 2to3 ne corrigent pas les espaces autour des virgules par défaut. Pour activer cette fonction, spécifiez le paramètre -f wscomma lors de l’appel 2to3 sur la ligne de commande.

Notes Before After
a ,b a, b
{a :b} {a: b}
  • #### Les idiomes communs

De nombreuses routines ont été établies dans la communauté Python. Certaines, comme la boucle while 1: qui remonte à Python 1. Python n’avait pas de vrais types de boules jusqu’à Python 2.3, donc les développeurs utilisaient auparavant des substituts de 1 et 0.

Par défaut, les scripts 2to3 ne corrigent pas ces routines. Pour activer cette fonctionnalité, spécifiez le paramètre -f idioms lors de l’appel 2to3 sur la ligne de commande.

Notes Before After
while 1:
  do_stuff()
while True:
  do_stuff()
type(x) == T isinstance(x, T)
type(x) is T isinstance(x, T)
a_list = list(a_sequence) a_list = sorted(a_sequence)
a_list.sort() do_stuff(a_list)
do_stuff(a_list)

Il a été retrouvé mort.Le blog du CSDN

Comment convertir du code Python 2 en code Python 3

Il s’agit d’une question de conversion du code de Python 2.x vers le code de Python 3.x. Comment convertir du code Python 2.x en code Python 3.x

  • #### 1. Faites-le vous-même

Il n’y a pas grand-chose à dire si cela concerne seulement quelques fonctions, comme print etc.

Si vous avez besoin d’un code, vous pouvez le modifier vous-même

  • #### 2. Utilisez le script Python pour effectuer une conversion automatique

Les versions 2.x de Python, comme la version 2.7.2 que j’ai installée, sont livrées avec des outils utiles après le téléchargement et l’installation sur Windows.

L’un d’eux s’appelle 2to3.py, et il est conçu pour vous aider à transformer le code de Python 2.x en celui de Python 3.x.

Il est situé dans le répertoire racine des installations de Python.

Comment utiliser 2to3.py pour réaliser la conversion du code de Python 2.x en code Python 3.x Par exemple, j’ai un script en Python 2.x:

D:\tmp\tmp_dev_root\python\python2_to_python3\34563264_data_from_site.py

Maintenant, le code pour le convertir en Python 3.x.

Vous pouvez le faire en ouvrant le cmd de windows, en le plaçant sous le script à convertir, puis en l’exécutant.

D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -w 34563264_data_from_site.py

La conversion est réussie et les résultats sont:

D:\tmp\tmp_dev_root\python\python2_to_python3>D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -w 34563264_data_from_site.py
RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: set_literal
RefactoringTool: Skipping implicit fixer: ws_comma
RefactoringTool: Refactored 34563264_data_from_site.py
--- 34563264_data_from_site.py  (original)
+++ 34563264_data_from_site.py  (refactored)
@@ -18,7 +18,7 @@
 import time;
 import codecs;
 import logging;
-import urllib;
+import urllib.request, urllib.parse, urllib.error;
 from datetime import datetime,timedelta;
 from optparse import OptionParser;
 from string import Template,replace;
@@ -90,7 +90,7 @@
         foundPhone = eachItemSoup.find(attrs={"class":"phone"});
         logging.debug("foundPhone=%s", foundPhone);
         if(foundPhone):
-            foundPhoneUni = unicode(foundPhone);
+            foundPhoneUni = str(foundPhone);
             logging.debug("foundPhoneUni=%s", foundPhoneUni);
             # case 1:
             #<p class="phone"><strong>phone:</strong>&nbsp;800.206.7886<br />
@@ -122,7 +122,7 @@
         foundWeb = eachItemSoup.find(attrs={"class":"web"});
         logging.debug("foundWeb=%s", foundWeb);
         if(foundWeb):
-            foundWebUni = unicode(foundWeb);
+            foundWebUni = str(foundWeb);
             logging.debug("foundWebUni=%s", foundWebUni);
 
             # <p class="web"><strong>e-mail:</strong>&nbsp;<a href="#">sales@cinesysinc.com</a><br />
@@ -151,7 +151,7 @@
         foundAddr = eachItemSoup.find(attrs={"class":"addr"});
         logging.debug("foundAddr=%s", foundAddr);
         if(foundAddr):
-            foundAddrUni = unicode(foundAddr);
+            foundAddrUni = str(foundAddr);
 
             # <p class="addr">
                 # <strong>address:</strong>&nbsp;740 SW 21st Ave, Suite #310<br />
RefactoringTool: Files that were modified:
RefactoringTool: 34563264_data_from_site.py

À ce stade, vous pouvez voir que l’ancien 34563264_data_from_site.py est devenu le code de Python 3.x.

Il y a aussi un fichier bak::34563264_data_from_site.py.bak, comparez les deux et vous verrez la différence:

Changements entre Python 2.x.x et Python 3.x.x et comment convertir Python 2.x.x en Python 3.x.x

Pour 2to3.py en lui-même, vous pouvez également consulter la page d’aide pour en savoir plus:

D:\tmp\tmp_dev_root\python\python2_to_python3>D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -h
Usage: 2to3 [options] file|dir ...
 
Options:
  -h, --help            show this help message and exit
  -d, --doctests_only   Fix up doctests only
  -f FIX, --fix=FIX     Each FIX specifies a transformation; default: all
  -j PROCESSES, --processes=PROCESSES
                        Run 2to3 concurrently
  -x NOFIX, --nofix=NOFIX
                        Prevent a transformation from being run
  -l, --list-fixes      List available transformations
  -p, --print-function  Modify the grammar so that print() is a function
  -v, --verbose         More verbose logging
  --no-diffs            Don't show diffs of the refactoring
  -w, --write           Write back modified files
  -n, --nobackups       Don't write backups for modified files

Voici quelques explications à ce sujet:

(1) Si le paramètre -w n’est pas ajouté, le diff correspondant au processus de conversion est simplement imprimé dans la fenêtre actuelle.

(2) Ajouter -w, c’est réécrire le contenu modifié dans le document original.

(3) Si vous ne voulez pas générer de fichier bak, ajoutez -n.

(4) Si vous ne voulez pas voir ce qui sort, ajoutez des “no-diffs”.

Pour les autres, il n’y a pas grand-chose à dire.

La traduction de 2 à 3 ci-dessus est tirée deDans la rue

Si vous avez des erreurs, n’hésitez pas à les signaler !_^