Python >> Tutoriel Python >  >> Python

Gestion des exceptions Python sur une ligne

Résumé  :Vous pouvez accomplir une gestion d'exception de ligne avec le exec() solution de contournement en passant le try à une ligne /except bloc sous forme de chaîne dans la fonction comme ceci :exec('try:print(x)\nexcept:print("Exception!")') . Cette méthode générale fonctionne pour tous les blocs try et except personnalisés, même multilignes. Cependant, vous devriez éviter ce code à une ligne en raison de sa mauvaise lisibilité.

Étonnamment, il y a eu une discussion sur la gestion des exceptions sur une ligne sur la liste de diffusion Python officielle en 2013. Cependant, depuis lors, il n'y a pas eu de nouvelle fonctionnalité de « gestion des exceptions sur une ligne » dans Python. Nous devons donc nous en tenir aux méthodes présentées dans ce didacticiel. Mais ils seront amusants, promis !

Plongeons dans le problème :

Problème :Comment écrire le bloc try/except dans une seule ligne de code Python ?

Exemple :Considérez le bloc try/except suivant.

try:
    print(x)
except:
    print('Exception!')

Solution  :Avant de nous plonger dans chacune des trois méthodes pour résoudre ce problème, donnons un aperçu rapide dans notre shell de code interactif :

Exercice :Exécutez le code. Pourquoi n'y a-t-il que trois lignes de sortie ? Modifiez le code de sorte que chacune des quatre méthodes génère une sortie !

Méthode 1 :Opérateur ternaire

La méthode suivante pour remplacer une simple instruction try/except est basée sur l'opérateur ternaire.

Contexte de l'opérateur ternaire :L'opérateur ternaire le plus basique x if c else y se compose de trois opérandes x , c , et y . C'est une expression avec une valeur de retour. L'opérateur ternaire renvoie x si l'expression booléenne c évalue à True . Sinon, si l'expression c évalue à False , l'opérateur ternaire renvoie l'alternative y .

Vous pouvez utiliser le dir() fonction pour vérifier si le nom de la variable 'x' a déjà été défini en utilisant la condition 'x' in dir() . Si la condition est évaluée à True , vous exécutez le bloc try. S'il est évalué à False , vous exécutez le bloc except.

# Method 1
print(x) if 'x' in dir() else print('Exception!')

Le résultat de cet extrait de code en tant que code autonome est :

Exception!

C'est parce que la variable x n'est pas défini et n'apparaît pas dans le répertoire des noms de variables :

print(dir())
# ['__annotations__', '__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']

Par exemple, si vous définissez la variable x au préalable, le code parcourra :

x = 2
print(x) if 'x' in dir() else print('Exception!')

Un inconvénient de cette technique est que vous devez connaître les types d'exceptions qui peuvent se produire. En outre, il devient plus difficile d'exprimer des blocs d'essai et d'exception multilignes. Dans ce cas, il est souvent préférable d'utiliser les déclarations try/except explicites en premier lieu !

Méthode 2 :exec()

Le exec() La fonction prend une chaîne et l'exécute comme s'il s'agissait d'un morceau de code source. De cette façon, vous pouvez compresser n'importe quel algorithme en une seule ligne. Vous pouvez également compresser l'instruction try/except en une seule ligne de code de cette façon !

# Method 2
exec('try:print(x)\nexcept:print("Exception!")')

Si vous aviez défini la variable x au préalable, le résultat serait différent :

exec('x=2\n' + 'try:print(x)\nexcept:print("Exception!")')
# 2

Maintenant, la variable 2 est définie et le bloc try de l'instruction s'exécute sans exception.

Méthode 3 :Contextlib Suppress + With Statement

Si vous n'êtes pas vraiment intéressé par la partie sauf et que vous avez juste besoin d'attraper des exceptions, cette méthode peut être pour vous :

# Method 3
from contextlib import suppress
with suppress(NameError): print(x)

Vous utilisez un bloc with et l'écrivez sur une seule ligne. L'objet que vous passez dans le bloc with doit définir deux fonctions __enter__() et __exit__() . Vous utilisez le suppress() méthode du contextlib package pour créer un tel objet (un soi-disant gestionnaire de contexte ) qui supprime l'occurrence de NameError. La beauté du bloc with est qu'il garantit que toutes les erreurs sur le with objet sont manipulés et l'objet est correctement fermé via le __exit__() méthode.

L'inconvénient ou l'avantage, selon vos préférences, est qu'il n'y a pas de bloc sauf.

Merci d'avoir lu ce tutoriel de blog ! 🙂

Livre Python One-Liners :maîtrisez d'abord la ligne unique !

Les programmeurs Python amélioreront leurs compétences en informatique avec ces lignes utiles.

Python One-Liners vous apprendra à lire et à écrire des « lignes simples » :des déclarations concises de fonctionnalités utiles regroupées dans une seule ligne de code. Vous apprendrez à décompresser et à comprendre systématiquement n'importe quelle ligne de code Python, et à écrire du Python éloquent et puissamment compressé comme un expert.

Les cinq chapitres du livre couvrent (1) les trucs et astuces, (2) les expressions régulières, (3) l'apprentissage automatique, (4) les principaux sujets de science des données et (5) les algorithmes utiles.

Des explications détaillées des one-liners introduisent les concepts clés de l'informatique etdéveloppez vos compétences en matière de codage et d'analyse . Vous découvrirez les fonctionnalités Python avancées telles que la compréhension de liste , tranchage , fonctions lambda , expressions régulières , carte et réduire fonctions et affectations de tranches .

Vous apprendrez également à :

  • Exploiter les structures de données pour résoudre des problèmes réels , comme utiliser l'indexation booléenne pour trouver des villes avec une pollution supérieure à la moyenne
  • Utiliser les bases de NumPy comme tableau , forme , axe , tapez , diffusion , indexation avancée , tranchage , tri , recherche , agrégation , et statistiques
  • Calculer des statistiques de base de tableaux de données multidimensionnels et les algorithmes K-Means pour l'apprentissage non supervisé
  • Créer davantage d'expressions régulières avancées en utilisant le regroupement et groupes nommés , anticipations négatives , caractères échappés , espaces blancs, jeux de caractères (et jeux de caractères négatifs ) et opérateurs gourmands/non gourmands
  • Comprendre un large éventail de sujets informatiques , y compris les anagrammes , palindromes , surensembles , permutations , factorielles , nombres premiers , Fibonacci chiffres, obscurcissement , recherche , et tri algorithmique

À la fin du livre, vous saurez comment écrire Python dans sa forme la plus raffinée , et créez de belles pièces concises d'"art Python" en une seule ligne.

Obtenez vos Python One-Liners sur Amazon !!