Il est temps de parler de ce qu'il faut faire avec la migration Python 3, j'ai donc enquêté un peu.
La prise en charge de la série Python 2 a été officiellement annoncée jusqu'en 2020. (Il semble qu'il n'y ait pas de 2.8) Que votre produit Python actuel soit ou non opérationnel jusqu'en 2020 Il est temps que vous envisagiez de migrer vers Python3.
Tout d'abord, une petite énumération de la façon dont cela va changer
Python2.X | Python3.X | Le système 3 fonctionne-t-il avec la notation système 2? |
---|---|---|
print 'xxx' | print('xxx') | × |
xrange(1, 10) | range(1, 10) | × |
except Error, V | except Error as V | × |
range semble être le comportement de xrange en 3 séries.
Cela ne signifie pas que la transition du 2e système au 3e système changera autant. C'est juste un changement de syntaxe mineur. (Vérifiez si la bibliothèque externe le prend en charge)
Même si le support est sorti, il doit être exploité jusque-là, et il est inefficace de le mettre en œuvre séparément pour les 2e et 3e systèmes. Par conséquent, il n'est pas possible de couper le 2e système et de faire une transition, et il est réaliste de trouver un moyen de coexister avec le 3e système. Heureusement, en Python, les 2e et 3e séries peuvent cohabiter.
Comme c'est un gros problème, l'outil de migration est également 2to3 2to3 est disponible sous forme de bibliothèque de conversion par lots. Il est intégré à Python pour que vous n'ayez pas à l'installer en externe.
Il semble qu'il organisera la syntaxe et l'importera comme il convient en fonction de la syntaxe du système Python 3. 2to3 n'a pas la fonction de convertir de 3 séries en 2 séries. Mais il existe également une bibliothèque tierce appelée 3to2. (Êtes-vous là?) https://pypi.python.org/pypi/3to2
Voici ce que vous pouvez faire pour maintenir la compatibilité.
Le système de l'environnement d'exécution 2 peut être utilisé pour la notation du système 3. http://docs.python.jp/2/library/future.html
Vous pourrez écrire avec print ().
from __future__ import print_function
print ('hoge')
Écrire Unicode comme u'hogehoge 'élimine le besoin de u.
>>> from __future__ import unicode_literals
>>> 'Japonais'
u'\u65e5\u672c\u8a9e'
>>> u'Japonais'
u'\u65e5\u672c\u8a9e'
L'importation a une priorité d'importation absolue (difficile à expliquer)
from __future__ import absolute_import
Il y en a trois ou quatre de plus, mais ils sont omis car ils ne sont pas très pertinents pour Python 2.6 et supérieur.
six Une bibliothèque compatible est également disponible. C'est six. 2 * 3 = 6 et cela semble être six. C'est facile à retenir. Ceci est une bibliothèque externe. http://hhsprings.bitbucket.org/docs/translations/python/six-doc-ja/
pip install six
Pour l'utiliser, il suffit de l'importer et de l'utiliser pour les parties incompatibles des 2e et 3e séries. Il sera utilisé en interne selon la version Python au moment de l'exécution.
Par exemple, dans le cas de chaînes de caractères
Python2 | Python3 | six |
---|---|---|
basestring | str | string_types |
unicode | str | text_type |
str | bytes | binary_type |
iterable (collection) Le système itérable semble similaire, donc si vous regardez le dict que vous pourriez utiliser souvent,
Python2 | Python3 | six |
---|---|---|
iterkeys | keys | iterkeys |
itervalues | values | itervalues |
iteritems | items | iteritems |
La notation est similaire au 2ème système.
Un bon nombre de composants intégrés peut être absorbé par six.
Il existe une feuille de triche compatible 2-3! http://python-future.org/compatible_idioms.html
J'ai trouvé que c'était compatible, mais trouver et réparer les pièces correspondantes une par une est un effort ridicule. Je veux une bibliothèque de conversion par lots. Y a-t-il?
était! https://github.com/python-modernize/python-modernize Il semble qu'il sera également converti en utilisant six, donc cela semble assez prometteur. Quand j'ai regardé un peu la source, il y en avait six et à venir, donc je pense qu'ils seront convertis en un sentiment agréable! ?? J'aimerais l'essayer à un autre moment. (Je n'ai pas eu assez de temps cette fois. Je suis vraiment désolé.) (Si vous l'avez essayé, c'est votre chance d'écrire d'abord un article!)
La migration prend beaucoup de temps, mais il y a de bonnes choses à propos de Python3.
http://docs.python.jp/3/library/typing.html Vous pouvez spécifier le type lors de la définition d'une fonction ou d'une classe.
def greeting(name: str) -> str:
return 'Hello ' + name
Contrairement au langage de compilation, il ne peut pas être vérifié à l'exécution, Il est assez important de connaître le type d'argument immédiatement pendant le développement afin d'éviter les bogues.
C'est un dictionnaire qui peut être récupéré dans l'ordre dans lequel il a été saisi. Auparavant, je me souviens d'avoir mis l'ordre de tri en valeur, puis de le trier, cela semble donc utile.
>>> from collections import OrderedDict
>>> od = OrderedDict()
>>> od['a'] = 1
>>> od['b'] = 2
>>> od['c'] = 3
>>> for k, v in od.items():
... print(k, v)
...
a 1
b 2
c 3
>>> od2 = OrderedDict()
>>> od2['c'] = 3
>>> od2['b'] = 2
>>> od2['a'] = 1
>>> for k, v in od2.items():
... print(k, v)
...
c 3
b 2
a 1
Cela semble être encore plus rapide depuis Python 3.5!
De plus, il semble que des générateurs asynchrones seront implémentés dans Python 3.6, et le rêve se répandra. Prenons en charge Python3 pour les nouvelles fonctionnalités ainsi que le motif négatif de la date limite de support!
Recommended Posts