Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Licence CC BY-NC-ND Thierry Parmentelat & Arnaud Legout Inria - UCA

Exercice - niveau avancé

Le module this et le Zen de Python

Nous avons déjà eu l’occasion de parler du Zen de Python ; on peut lire ce texte en important le module this comme ceci

import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Il suit du cours qu’une fois cet import effectué nous avons accès à une variable this, de type module :

this
<module 'this' from '/usr/lib/python3.12/this.py'>

But de l’exercice

# chargement de l'exercice
from corrections.exo_decode_zen import exo_decode_zen

Constatant que le texte du manifeste doit se trouver quelque part dans le module, le but de l’exercice est de deviner le contenu du module, et d’écrire une fonction decode_zen, qui retourne le texte du manifeste.

Indices

Cet exercice peut paraître un peu déconcertant ; voici quelques indices optionnels :

# on rappelle que dir() renvoie les noms des attributs 
# accessibles à partir de l'objet
dir(this)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'c', 'd', 'i', 's']

Vous pouvez ignorer this.c et this.i, les deux autres variables du module sont importantes pour nous.

# ici on calcule le résultat attendu
resultat = exo_decode_zen.resultat(this)

Ceci devrait vous donner une idée de comment utiliser une des deux variables du module :

# ces deux quantités sont égales
len(this.s) == len(resultat)
True

À quoi peut bien servir l’autre variable ?

# se pourrait-il que d agisse comme un code simple ?
this.d[this.s[0]] == resultat[0]
True

Le texte comporte certes des caractères alphabétiques

# si on ignore les accents, 
# il y a 26 caractères minuscules
# et 26 caractères majuscules
len(this.d)
52

mais pas seulement ; les autres sont préservés.

À vous de jouer

def decode_zen(this):
    "<votre code>"

Correction

exo_decode_zen.correction(decode_zen)
Loading...