Blog

Python 3.7 maintenant disponible sur Scalingo

Chargement...

5 min de lecture

Python 3.7 maintenant disponible sur Scalingo

Le support de Python 3.7 est désormais disponible publiquement sur Scalingo !

""

Maintenant que notre récent travail sur les stacks est terminé, nous avons de bonnes nouvelles pour les développeurs Python : le support de Python 3.7 est maintenant disponible publiquement sur Scalingo ! À partir de maintenant, vous pouvez exécuter une application Python 3.7 en un instant.

Activer Python 3.7 pour votre application

Exécuter votre application avec le puissant Python 3.7 est aussi simple que de le spécifier dans votre fichier Pipfile :

[requires]
python_version = "3.7"
[requires]
python_version = "3.7"
[requires]
python_version = "3.7"
[requires]
python_version = "3.7"

Si vous avez déjà une application en cours d'exécution, mettez simplement à jour votre fichier Pipfile avec une version plus récente. Ensuite, git commit et git push ce changement.

Notez que votre application doit utiliser le stack `scalingo-18`. Si votre application a été créée après le 6 août 2019, elle utilise déjà ce nouveau stack. Sinon, vous voudrez peut-être spécifier le stack avec `scalingo --app my-app stacks-set scalingo-18`. En savoir plus sur les stacks dans notre [centre de documentation](https://doc.scalingo.com/platform/deployment/stacks).

Quoi de neuf dans Python 3.7

Cette nouvelle version de Python présente des mises à jour significatives du langage. Voici quelques-unes des plus importantes.

async/await : Concurrence sur Stéroïdes

Python a reçu d'excellentes nouvelles fonctionnalités dans asyncio, sa bibliothèque de concurrence. Il a également introduit deux nouveaux mots-clés async et await qui facilitent l'exécution de fonctions de manière asynchrone.

Vous devez d'abord déclarer une coroutine avec le mot-clé async. Ensuite, l'appel de cette coroutine se fait en préfixant l'appel avec await.

Voici un exemple de comment exécuter concurrentement deux tâches :

import asyncio

async def my_coroutine():
  await asyncio.sleep(2)

async def main():
  task1 = asyncio.create_task(my_coroutine())
  task2 = asyncio.create_task(my_coroutine())

  await task1
  await task2

asyncio.run(main())
import asyncio

async def my_coroutine():
  await asyncio.sleep(2)

async def main():
  task1 = asyncio.create_task(my_coroutine())
  task2 = asyncio.create_task(my_coroutine())

  await task1
  await task2

asyncio.run(main())
import asyncio

async def my_coroutine():
  await asyncio.sleep(2)

async def main():
  task1 = asyncio.create_task(my_coroutine())
  task2 = asyncio.create_task(my_coroutine())

  await task1
  await task2

asyncio.run(main())
import asyncio

async def my_coroutine():
  await asyncio.sleep(2)

async def main():
  task1 = asyncio.create_task(my_coroutine())
  task2 = asyncio.create_task(my_coroutine())

  await task1
  await task2

asyncio.run(main())

La nouvelle fonctionnalité des variables de contexte est également là pour améliorer la concurrence dans Python. Ce concept est similaire à un stockage local par thread, mais il permet également de suivre correctement les valeurs par tâche asynchrone.

import contextvars
import asyncio

counter = contextvars.ContextVar("counter", default="0")

async def set_one():
  counter.set("1")

async def print_counter():
  print(counter.get())

asyncio.run(set_one()) # Set the value of counter to 1 in a given context
asyncio.run(print_counter()) # Prints "0" as it is executed in a different context
import contextvars
import asyncio

counter = contextvars.ContextVar("counter", default="0")

async def set_one():
  counter.set("1")

async def print_counter():
  print(counter.get())

asyncio.run(set_one()) # Set the value of counter to 1 in a given context
asyncio.run(print_counter()) # Prints "0" as it is executed in a different context
import contextvars
import asyncio

counter = contextvars.ContextVar("counter", default="0")

async def set_one():
  counter.set("1")

async def print_counter():
  print(counter.get())

asyncio.run(set_one()) # Set the value of counter to 1 in a given context
asyncio.run(print_counter()) # Prints "0" as it is executed in a different context
import contextvars
import asyncio

counter = contextvars.ContextVar("counter", default="0")

async def set_one():
  counter.set("1")

async def print_counter():
  print(counter.get())

asyncio.run(set_one()) # Set the value of counter to 1 in a given context
asyncio.run(print_counter()) # Prints "0" as it is executed in a different context

breakpoint : Faciliter la vie du développeur

Python 3.7 introduit le nouveau breakpoint qui vise uniquement à simplifier la vie du développeur. Il suffit d'appeler breakpoint() pour ouvrir le débogueur à l'emplacement de l'appel.

Cela peut sembler un petit changement, mais après quelques jours d'utilisation, vous serez convaincu de l'utilité de cette mise à jour !

Classes de Données

Python 3.7 introduit un nouveau décorateur dataclass qui vise à simplifier l'écriture de classes de données. Une classe de données décrit ses attributs à l'aide d'annotations de variables de classe. Tous les méthodes magiques sont ensuite générées automatiquement :

@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0

p = Point(1.5, 2.5)
print(p)   # produces "Point(x=1.5, y=2.5, z=0.0)"
@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0

p = Point(1.5, 2.5)
print(p)   # produces "Point(x=1.5, y=2.5, z=0.0)"
@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0

p = Point(1.5, 2.5)
print(p)   # produces "Point(x=1.5, y=2.5, z=0.0)"
@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0

p = Point(1.5, 2.5)
print(p)   # produces "Point(x=1.5, y=2.5, z=0.0)"

Améliorations de Performance

Une autre grande amélioration de cette version concerne la performance. L'équipe Python a travaillé dur pour améliorer les performances globales des programmes Python dans divers domaines. Ces améliorations vont de la réduction du temps de démarrage de Python (réduction de 10 % sur Linux !) à la réécriture de nombreuses méthodes en tenant compte de la performance. La surcharge de l'appel d'une seule méthode a été réduite jusqu'à 20 % grâce à quelques modifications de bytecode, et appeler une méthode est probablement quelque chose que vous faites dans votre programme Python !

Bien d'autres choses

Bien d'autres nouvelles choses merveilleuses ont été publiées dans cette version, comme l'ordre des dictionnaires qui est maintenant préservé, une meilleure gestion du DeprecationWarning, et un nouveau mode d'exécution de développement… Lisez le billet de blog complet et le cahier des charges pour une liste complète des nouveautés.

Photo par Markéta Marcellová sur Unsplash

Etienne Michon, Scalingo

Étienne Michon

Docteur en informatique, Étienne Michon occupe actuellement le poste d'ingénieur R&D chez Scalingo. Il était l'un des premiers employés de Scalingo et il contribue grandement à faire grandir ce blog grâce à ses articles techniques de qualité.

Restez informé

Recevez des articles et des mises à jour de la plateforme dans votre boîte de réception.

Prêt à déployer en toute confiance ?

Découvrez des déploiements sans temps d'arrêt, une mise à l'échelle automatique intelligente et une infrastructure entièrement gérée. Commencez à déployer vos applications sur Scalingo dès aujourd'hui.

Aucune carte de crédit requise • Déployez en quelques minutes • Annulez à tout moment

Dégradé arrière-plan section

Déployez une application ou base de données

Commencez à déployer

Rejoignez les équipes qui misent sur une plateforme cloud européenne et souveraine, conçue pour livrer rapidement et opérer sereinement.

Dégradé arrière-plan section

Déployez une application ou base de données

Commencez à déployer

Rejoignez les équipes qui misent sur une plateforme cloud européenne et souveraine, conçue pour livrer rapidement et opérer sereinement.

Dégradé arrière-plan section

Déployez une application ou base de données

Commencez à déployer

Rejoignez les équipes qui misent sur une plateforme cloud européenne et souveraine, conçue pour livrer rapidement et opérer sereinement.