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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 741
    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 741
    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.

+ 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