lundi 5 octobre 2009

dive into python (1)

Je me suis décider à relire ce merveilleux ouvrage qu'est "dive into python" . Heureusement, il est disponible en français ici Je vais donc tenter de vous décrire une page par post. C'est une bonne façon pour moi de me remettre à ce langage. Pour vous, c'est certainement une bonne façon d'entrer en douceur dans ce langage d'une élégance rare.

le code du jour

<span class="pykeyword">def</span> buildConnectionString(params):
<span class="pystring">"""Build a connection string from a dictionary of parameters.

Returns string."""</span>
<span class="pykeyword">return</span> <span class="pystring">";"</span>.join([<span class="pystring">"%s=%s"</span> % (k, v) <span class="pykeyword">for</span> k, v <span class="pykeyword">in</span> params.items()])

<span class="pykeyword">if</span> __name__ == <span class="pystring">"__main__"</span>:
myParams = {<span class="pystring">"server"</span>:<span class="pystring">"mpilgrim"</span>, \
<span class="pystring">"database"</span>:<span class="pystring">"master"</span>, \
<span class="pystring">"uid"</span>:<span class="pystring">"sa"</span>, \
<span class="pystring">"pwd"</span>:<span class="pystring">"secret"</span> \
}
<span class="pykeyword">print</span> buildConnectionString(myParams)
La première ligne crée la fonction buildConnectionString. Cette fonction accepte en parametres 'params'. En général, il est déconseillé de nommer les variables attendu de manière si 'lache' puisque ici le mot 'params' ne nous informe que très peut sur la nature des parametres attendus. Tout au plus, nous savons qu'on attend une liste, un dictionnaire ou un tuple.

La ligne suivante commençant par trois guillement est la documentation de la fonction . Cette ligne est capitale pour la suite, il faudra penser à ne jamais l'ommettre quand vous créez une fonction . En effet, divers outils vous permettent de relire cette documentation pour toutes les fonctions d'un programe. C'est un embryon de DDD ( Develloppement Dirigé par la Documentation).

ensuite viens le coeur de la fonction qui a été intégrée a la valeur de retour (return). Cette façon de faire, si elle est très concise et montre bien comment écrire de façon pythoniste est malgré tout assez dense. Décortiquons un peu.

les lettres k et v se réfèrent aux clés du dictionnaire (keys) et v aux valeurs (values).
params.items() fait référence aux éléments du dictionnaire ( les couples clé:valeurs )
on aurait donc put écrire :
for k, v in params.items :
    la suite du programe.

";".join(variable) est une méthode de chaine de caractère (string). la chaine de caractère ici est donc ";" qui va donc etre concaténé a sa variable.
pour finir, l'écriture suivante :
"%s=%s % (k, v)
on remplace le symbole %s par la première valeur derière le dernier % et le second symbole par la seconde valeurs.
plus simplement :
"%s est sympa" % (paul) retourne : "paul est sympa"
donc
"%s et %s sont amis" %(paul, virginie) retourne : "paul et virginie sont amis"

reste à expliquer
<span class="pykeyword">if</span> __name__ == <span class="pystring">"__main__"</span>:
il s'agit ici d'une astuce extrêmement utilisée en python qui va permettre de n'executer le bout de code suivant seulement et seulement si le programme qui est lancé corespond au fichier dans lequel se ttrouve la fonction. C'est gééralement très utile pour déboguer une partie de code avant de l'insérer dans un ensemble plus grand.

Aucun commentaire: