SWEET -- le forum

SWEET : Wake Up Easily Every Time

You are not logged in.

#1 20-07-2007 17:23:01

isatis39871
Administrator
Registered: 14-02-2006
Posts: 289
Website

Duck typing en python

J'écris ce message sous le coup de l'enthousiasme après une découverte complètement par hasard sur python.

On parle beaucoup du Duck Typing sur Ruby, le fameux "si ça marche comme un canard, vole comme un canard, et fait coincoin comme un canard, alors ça ressemble assez à un canard pour l'utiliser comme tel". En général on utilise cette spécificité pour créer des fonctions indépendantes du type de données traitées, mais basées sur un comportement.

En Python, la philosophie s'y prête bien aussi ("import this :-)).

Je savais déjà que l'objet fichier était un itérable, ce qui signifiait qu'on pouvais le parcourir comme une liste en lecture, et faire du ligne à ligne dans un fichier texte avec un simple :

Code:

for x in open('file', 'r') :
    print x

Mais tout à l'heure je suis tombé sur un site sympatique (http://www.gotapi.com/html), depuis lequel j'ai consulté la documentation sur le type Array en Python. En effet je fais du PHP, et je me demandais pourquoi en Python on avait des array alors qu'on a les listes et les dicos.

Il y était écris qu'on pouvait l'initialiser avec n'importe quel iterable, ceci indiquant bien entendu en premier lieu les listes. Et me viens soudainement la question suivante : jusqu'à quel point un fichier est un itérable comme les autres. J'ai fais quelques tests, et vous allez voir, c'est bluffant :

Code:

fIn [1]: file = open('test', 'w')

In [2]: file.write('Ceci est un test\nLigne 2\nLigne 3')

In [4]: file.close()

# le join marche comme sur une liste !

In [7]: a = 'concatenation_magique\n'.join(open('test'))

In [8]: print a
Ceci est un test
concatenation_magique
Ligne 2
concatenation_magique
Ligne 3

# donc on peut afficher le contenu d'un fichier comme un cat en bash :

In [27]: print ''.join(open('test'))
Ceci est un test
Ligne 2
Ligne 3

# mieux encore, les mutations de listes marchent sur les fichiers
# on peut par exemple filtrer toutes les lignes contenant "test"
# comme un grep en bash :

In [12]: [ x for x in open('test') if 'test' in x]
Out[12]: ['Ceci est un test\n']

# les possibilités sont variées, avec affichage de celles qui matchent ou pas
# et même les regex du coup

# Enfin par voie de conséquence, on peut donc transformer un fichier en tuple :

In [13]: tuple( open('test') )
Out[13]: ('Ceci est un test\n', 'Ligne 2\n', 'Ligne 3')

Bref, python, c'est de la bombe atomique, comme d'habitude.


Je suis une brute : http://jackal-hope.labrute.fr

Offline

 

Board footer

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson