Précisions Python (Partie 1) : getattr()

Par virtual_eye, 23 janvier 2009 10 h 14 min
Je me disais bien que c'etait possible en perl mais n'avais jamais approfondi le sujet .. et là ... en lisant du code, je trouve ...
<pre lang="text">
$method = 'bar';
$foo->$method('booh');

Alors oui, cela reste dans l'esprit de l'exemple montré dans le commentaire Puisqu'il faut troller... bah je m'y mets

Cependant dans ce bout d'exemple :

mp3info={'artist': 'Metallica', 'album': 'Master Of Puppets', 'year': '1986', 'genre': 'Thrash Metal'}
for key in mp3info:
    getattr(album, 'set_%s' % key)(mp3info.get(key))

getattr() te renvoit un objet Method d'une référence à une classe album ayant pour nom de méthode set_(la clé fournie par la boucle)
Tu peux directement lui balancer, sur une ligne, les arguments nécessaires à son éxecution : la valeur du dictionnaire pour la clé fournie
En réalité :
getattr(album, 'set_artist') est équivalent à album.set_artist

en ruby:
<pre lang="text">
foo.bar() est équivalent a foo.send('bar')

Question : Peux-t'on faire foo.send('bar')('titi') ?
titi étant l'argument nécessaire à l'exécution de foo.bar()

Related posts:

  1. Précisions Python (Partie 2) : regex avec commentaires
  2. perl OO send message

3 commentaires à “Précisions Python (Partie 1) : getattr()”

  1. mc dit :

    d’apres ce que je comprend, c’est pile poil la meme chose :


    for key in mp3info:
    getattr(album, 'set_%s' % key)(mp3info.get(key))

    donne en perl:


    while ( my($k,$v) = each %mp3info ) {
    my $method = "set_$_";
    $album->$method($v);
    }

    sauf qu’en perl, on aurait plutot tendance a dire que $album est une référence de type ‘Album’ à ton tableau associatif. (pour des trucs aussi simples, c’est ce que j’aurais fais).

    Je te livre ma solution brut de fonderie pour info


    my $album = bless \%mp3info,'Album';

    Maintenant:
    - c’est déroutant pour qui ne connait pas les objets en perl5
    - c’est enfantin pour qui les connait
    - c’est un modèle qui extremement simple a utiliser mais réclamant un peu de réflexion pour etre compris
    - c’est génant pour tous ceux qui n’arrivent pas a concidérer l’objet autrement que par le mot-clef class (et qui ne comprennent pas ce qu’est un namespace)

    Je peux rentrer avec joie dans des explications qui vous feront comprendre
    - pourquoi je pense que le modele objet de perl5 est au moins aussi puissant que le modèle de python
    - que ca n’est pas plus compliqué: c’est juste différent!
    - qu’il faut reconnaitre que c’est tellement souple que ca permet parfois de faire n’importe quoi et qu’a ce niveau la, je serais presque tenté par un recadrage … sauf qu’il parait que python n’apporte que moyenement ce recadrage (par exemple: python permet aussi de modifier des methodes a la volée, tout ca …)

    Est ce que ca vaut le coup ? Parrot sort en mars, rakudo avance a pas de geants. C’est pourquoi je vous disais qu’a part la curiosité intéllectuelle, je crois qu’il n’y a aucune bonne raison pour vous de plonger dans des concepts trop avancés de perl5.

    Dites-moi …

    Question ruby : Peux-t’on faire foo.send(‘bar’)(‘titi’) ?
    réponse : c’est foo.send(‘bar’,'titi’)

  2. virtual_eye dit :

    [code]
    my $album = bless \%mp3info,'Album'
    [/code]
    va créer un objet Album à partir du tableau associatif mp3info si je comprends bien qu’il affecte à $album

    Pb : mon tableau associatif a pour but de redéfinir à la volée les attributs de l’objet donc ne contiendra pas forcément tous les attributs nécessaires à la création d’un objet Album
    -> lors de ton bless, ça risque fort de se vautrer.

    Sinon, l’intérêt est de modifier réellement un objet déjà instantié dans mon exemple

  3. mc dit :

    Il n’y a pas de clonage de la structure: on dit simplement que $album est une référence (a laquelle on adjoint les methodes du package Album) à %mp3info.

    $album->delete_artist (si ta methode est definie) supprimera $mp3info{artiste} et viseversa. c’est le meme objet!

    si tu fais print $album et print \%mp3info, tu verras que c’est le meme endroit en memoire!

    si tu veux cloner tu copies le contenu du hash:

    my $album = bless { %mp3info },’Album’;

    attention: ca n’est pas un clonage complet si il y a des references dans les clefs (y’a des modules pour ca … deep::copy, je crois … jamais eu besoin)

Laisser un commentaire

Panorama Theme by Themocracy