IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Variable & fonction


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 106
    Par défaut Variable & fonction
    Bonjour,

    Je me permets de pauser une question concernant l'assignation d'une variable dans un nom de fonction.

    Voici la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mot="test"
    print hashlib.md5(mot).hexdigest()
    Dans mon script j'ai annoncé un choix et je demande à l'utilisateur de choisir, il renvoi soit
    Soit
    maintenant ce que je souhaite faire c'est que la fonction accueil une variable "var" a la place du type de hash en fonction de ce l'utilisateur choisi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print hashlib.var(mot).hexdigest()
    Mais j'ai une erreur.

    Merci de votre aide

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    voici une façon de faire, il y en a plusieurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mot = "test"
    var = "md5"
    print getattr(hashlib,var)(mot).hexdigest()
    var = "sha1"
    print getattr(hashlib,var)(mot).hexdigest()
    ou encore autre chose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    hashers = {'md5':hashlib.md5, 'sha1':hashlib.sha1}
    print hashers[var](mot).hexdigest()

  3. #3
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Le plus simple serait de faire un petit test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if var == "md5":
        print hashlib.md5(mot).hexdigest()
    elif var == "sda1":
        print hashlib.md5(mot).hexdigest()
    else:
        print 'var invalide'
    La méthode de kango est plus technique. Est-elle justifiée ici, je ne sais pas ?

  4. #4
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Bonjour,

    perso j'utiliserais plus une méthode à base de dictionnaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    d = {'md5': haslib.md5, 'sha1': hashlib.sha1}
    try:
        print d[var](mot).hexdigest()
    except KeyError:
        traiter_erreur()

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 106
    Par défaut
    J'ai retenu la première solution de Kango.

    Merci aussi aux autres membres pour l'intérêt qu'il ont porté a mon projet.

    Cdt

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Salut,

    Pour transformer:
    hashlib.var(mot).hexdigest()
    en
    hashlib(var)(mot).hexdigest()
    on peut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import hashlib
     
    def myhash(var):
        return lambda mot, var=var: getattr(hashlib, var)(mot)
     
    print myhash('md5')('toto').hexdigest()
    # ou
    foo = myhash('md5')
    print foo('toto').hexdigest()
    Note: Ca en jette mais ca équivaut à mettre var=>getattr(x, var) dans un dict sauf qu'ici on utilise les closures et le dict "locals" qui est déjà là.

    Ce qui avec des 'class' devrait s'écrire en plus verbeux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class MyHash(object):
        def  __init__(self, var):
              self._var = getattr(hashlib, var)
        def __call__(self, mot):
              return self._var(mot)
    Et si vous voulez limiter le nombre d'objets crées, on peut ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
         _instances = {}
         def __new__(cls, var):
               if var not in cls._instances:
                      instance = object.__new__(cls)
    #                  instance.__init__(var)  -- oops, en fait il y va tout seul
                      cls._instances[var] = instance
               return cls._instances[var]
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Toute méthode à base de getattr() est à proscrire si l'utilisateur peut entrer directement la valeur. Parce qu'alors il peut aussi entrer n'importe quoi d'autre (genre '__class__' par exemple ). Le dictionnaire est nettement plus sûr.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Citation Envoyé par sjrd Voir le message
    Toute méthode à base de getattr() est à proscrire si l'utilisateur peut entrer directement la valeur. Parce qu'alors il peut aussi entrer n'importe quoi d'autre (genre '__class__' par exemple ). Le dictionnaire est nettement plus sûr.
    Ah ben on peut mettre du "non fonctionnel" dedans bien que personnellement je serais plus partant pour décorer, style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    def _myhash(var):
             return lambda mot, var=var: getattr(hashlib, var)(mot)
     
    def myhash(var):
        if var in [ "la liste", "qu'on veux" ]:
               return _myhash(var)
        raise ValueError('la cle %(var)s est interdite' % vars())
    1. Ca montre bien que cela est de l'overhead par rapport 'au fonctionnel' de la chose. Est ce qu'on a intérêt à séparer les points de vue? il y a des bouquins sur Aspect Oriented Programming qui racontent cela...
    Ici, l'exemple est trop petit pour être significatif, mais illustre qu'il peut être (parfois) intéressant de pas mélanger...

    2. Et toujours pas de dict
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Si tu veux vraiment séparer, mieux vaut mettre le raise sous le if. Ainsi, il est très claire que le if et son code s'occupent du non-fonctionnel. Tandis qu'en-dessous se gère le cas correct.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    _VALID_METHODS = ["la liste", "qu'on veut"]
     
    def _myhash(var):
        return lambda mot, var=var: getattr(hashlib, var)(mot)
     
    def myhash(var):
        if var not in _VALID_METHODS:
            raise ValueError('la cle %(var)s est interdite' % vars())
        return _myhash(var)
    Bon maintenant il y a l'autre école qui dit qu'il faut mettre en évidence le code "normal", puis seulement mettre les cas d'erreur à la fin. Mais ça va à l'encontre du fonctionnel/non-fonctionnel.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Salut,

    Pour moi le fonctionnel se réduit à _myhash.

    Le non fonctionnel (ce qui est dans myhash) peut être écrit comme on veut...

    Où plus précisément suivant un contexte particulier - propre au "non fonctionnel" - dont les interprétations (et les implications) restent libres tant qu'elles ne sont pas contraintes par des critères tangibles du style: coûts, délais, qualité, maintenabilité, évolutivité, standards et pratiques, ...
    Et encore, les contraintes sont nécessaires mais parfois insuffisantes.

    A défaut, tu as raison, je n'ai pas tort et réciproquement
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Effectivement ça se tient
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'appels d'une variable entre fonctions
    Par julien.nasser dans le forum MFC
    Réponses: 12
    Dernier message: 26/04/2006, 09h23
  2. Réponses: 4
    Dernier message: 16/02/2006, 10h40
  3. Réponses: 6
    Dernier message: 06/01/2006, 20h55
  4. "class" vector à indice variable et fonction membr
    Par icetechnik dans le forum C++
    Réponses: 14
    Dernier message: 25/11/2005, 23h46
  5. changer et afficher une variable en fonction d'un select
    Par psychoBob dans le forum Général JavaScript
    Réponses: 30
    Dernier message: 22/11/2005, 08h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo