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 :

indirection dans python


Sujet :

Python

  1. #1
    Mod�rateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    F�vrier 2008
    Messages
    7 672
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 7 672
    Par d�faut indirection dans python
    Bonjour,

    je ne trouve pas d'informations sur la possibilit� de faire des indirections, comme en shell
    Code bash : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    $ v=w
    $ w=foo
    $ echo ${!v}
    foo

    soit
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    >> v = 'foo'
    >> w = 'bar'
    >> l = ( 'v', 'w' )
    je voudrais, en bouclant sur l, afficher les valeurs de v et w:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    >> for x in l:
        print(x)
    v #je voudrais foo
    w #je voudrais bar
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  2. #2
    Expert �minent
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 771
    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 771
    Par d�faut
    Salut,

    Citation Envoy� par N_BaH Voir le message
    je ne trouve pas d'informations sur la possibilit� de faire des indirections, comme en shell
    Vous devez penser � ce que vous voulez r�aliser avec Python et non essayer de traduire comment vous le feriez avec bash "shell" en Python.
    Et commencer par ne pas confondre variables et chaines de caract�res:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    >>> v = 'foo'; w = 'bar'
    >>> l = v, w
    >>> for x in l: print(x)
    ...
    foo
    bar
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2006
    Messages
    12 849
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 12 849
    Billets dans le blog
    1
    Par d�faut
    Bonjour
    Citation Envoy� par N_BaH Voir le message
    je ne trouve pas d'informations sur la possibilit� de faire des indirections, comme en shell
    Code bash : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    $ v=w
    $ w=foo
    $ echo ${!v}
    foo
    Parce que cette possibilit� n'existe pas. Enfin si avec eval() mais si tu l'utilises pour �a c'est que tu as un d�faut de conception. Python a plus de souplesse que le shell ce qui �vite donc d'avoir recours aux indirections.

    Citation Envoy� par N_BaH Voir le message
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    >> v = 'foo'
    >> w = 'bar'
    >> l = ( 'v', 'w' )
    je voudrais, en bouclant sur l, afficher les valeurs de v et w:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    >> for x in l:
        print(x)
    v #je voudrais foo
    w #je voudrais bar
    l=(v, w) et non l=('v', 'w')Apr�s si tu veux aussi voir apparaitre le nom...
    [code]>> v = 'foo'
    >> w = 'bar'
    >> d = {"v" : v, "w" : w}
    >> for (x, y) in d.items():
    print("%s => %s" % (x, y))
    De l� on peut se rendre compte alors que "v" et "w" perdent leur utilit�...
    Mon Tutoriel sur la programmation �Python�
    Mon Tutoriel sur la programmation �Shell�
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les diff�rentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Mod�rateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    F�vrier 2008
    Messages
    7 672
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 7 672
    Par d�faut
    je vois que je me suis mal exprimer :

    j'ai une liste de cha�nes, qui sont des noms de variables. Ces variables peuvent ne pas �tre assign�es*, et je voudrais les tester.

    je pensais le faire ainsi :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    l = ( 'nomVar1', 'nomVar2' )
    for x in l:
        if not x: #quel mécanisme pour tester que les variables nomVar1 et nomVar2 existent et ont une valeur ?
            print(f"err: {x} absent.")
            exit(1)
    --
    * ne me demandez pas pourquoi, c'est pour le d�couvrir que je voudrais les tester.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2006
    Messages
    12 849
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 12 849
    Billets dans le blog
    1
    Par d�faut
    Citation Envoy� par N_BaH Voir le message
    j'ai une liste de cha�nes, qui sont des noms de variables.
    Pardon de faire le lourd mais il n'y a aucune raison que tu en arrives � cette situation. Et si tu y arrives c'est que quelque part tu as rat� un truc plus en amont

    Citation Envoy� par N_BaH Voir le message
    * ne me demandez pas pourquoi, c'est pour le d�couvrir que je voudrais les tester.
    Ok pas de souci. Si c'est juste pour savoir comment le faire...
    Code python : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    >>> toto = "123"
    >>> var = "toto"
    >>> print(var)
    toto
    >>> print(eval(var))
    123
     
    >>> nomVar1 = "toto"
    >>> nomVar2 = "titi"
    >>> L = ("nomVar1", "nomVar2")
    >>> for x in L:
    ...     print(x, eval(x))
    ... 
    nomVar1 toto
    nomVar2 titi
    Mon Tutoriel sur la programmation �Python�
    Mon Tutoriel sur la programmation �Shell�
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les diff�rentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert �minent
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 771
    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 771
    Par d�faut
    Citation Envoy� par N_BaH Voir le message
    j'ai une liste de cha�nes, qui sont des noms de variables. Ces variables peuvent ne pas �tre assign�es*, et je voudrais les tester.
    Une variable qui n'a pas �t� assign�e n'existe pas et si on essaie d'y acc�der une exception NameError sera lev�e.

    Maintenant, une variable (qui existe), c'est l'association d'une chaine de caract�res avec un objet r�alis�e dans l'espace de noms globals()
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> l = ( 'nomVar1', 'nomVar2' )
    >>> nomVar2 = ''
    >>> for x in l:
    ...     v = globals().get(x)
    ...     if v is None:
    ...        print(x, 'absent')
    ...     else:
    ...        print(x, v)
    ...
    nomVar1 absent
    nomVar2
    >>>
    Mais dans ce cas, on utilise globals() comme un simple dictionnaire qui associe chaine de caract�re/clef � objet/valeur: autant utiliser un simple dictionnaire (pour ces choses l�) car l'int�r�t d'en faire des "variables" sera limit�.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Mod�rateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    F�vrier 2008
    Messages
    7 672
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 7 672
    Par d�faut
    Citation Envoy� par Sve@r
    Et si tu y arrives c'est que quelque part tu as rat� un truc plus en amont
    mais, c'est pas moi, c'est l'autre.

    je fais des requ�tes HTTP (requests.get(...)), et parfois, sans �chouer pourtant, la r�ponse semble vide...

    ok pour eval()
    merci.

    edit: � d�partager avec globals(), alors
    parce que ce n'est pas destin� � demeurer, je vais privil�gier le simple.

    merci.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2006
    Messages
    12 849
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 12 849
    Billets dans le blog
    1
    Par d�faut
    Citation Envoy� par N_BaH Voir le message
    mais, c'est pas moi, c'est l'autre.
    Si ce n'est toi c'est donc ton fr�re... ou quelqu'un des tiens...

    Citation Envoy� par N_BaH Voir le message
    je fais des requ�tes HTTP (requests.get(...)), et parfois, sans �chouer pourtant, la r�ponse semble vide...
    Comme en SQL, Python poss�de une notion de "nullit�" qui diff�re de "vide/rempli"
    Code python : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    >>> def rien(): pass
    ... 
    >>> def vide(): return ""
    ... 
    >>> def rempli(): return "123"
    ... 
    >>> var = rien()
    >>> var is None
    True
    >>> bool(var)
    False
     
    >>> var = vide()
    >>> var is None
    False
    >>> bool(var)
    False
     
    >>> var = rempli()
    >>> var is None
    False
    >>> bool(var)
    True
    >>>

    Citation Envoy� par N_BaH Voir le message
    ok pour eval()
    Essaye tout de m�me de voir si tu peux l'�viter

    Citation Envoy� par N_BaH Voir le message
    edit: � d�partager avec globals(), alors
    C'est vrai que "globals()" j'ai pas eu le r�flexe d'y penser ()
    C'est une fonction qui renvoie un dictionnaire de toutes les variables de ton code. Avec chaque variable utilis�e comme clef
    Code python : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    >> var = 123
    >>> globals()["var"]
    123
    >>> toto = "var"
    >>> globals()[globals()["toto"]]
    123
     
    >>> nomVar1 = "toto"
    >>> nomVar2 = "titi"
    >>> L = ("nomVar1", "nomVar2")
    >>> for x in L:
    ...     print(x, globals()[x])
    ... 
    nomVar1 toto
    nomVar2 titi
    Mais c'est une solution qui reste quand-m�me une "rustine"
    Mon Tutoriel sur la programmation �Python�
    Mon Tutoriel sur la programmation �Shell�
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les diff�rentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Mod�rateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    F�vrier 2008
    Messages
    7 672
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 7 672
    Par d�faut
    comme je l'ai dit, quand je conna�trai la raison de cette absence, cela n'aura pas de raison de rester.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Expert confirm�
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 100
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 100
    Par d�faut
    Hello,

    @N_Bah,

    Ce que tu veux s'appelle l'introspection en python, et pour cela on a le module inspect qui fait cela de mani�re propre, sans eval et sans globals.

    Voici un exemple que j'ai test� pour toi et ressemblant � ce que tu souhaites (v�rifier que des noms de variables sous forme de cha�nes de caract�res soient pr�sents dans un module python)

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    import inspect
    # obtenir le nom du module
    nom_module = inspect.getmodulename(__file__)
     
    # noms de variables à rechercher
    noms_variables = ['ma_variable_1', 'ma_variable_2', 'ma_variable_3']
     
    # définition de mes variables pour le test
    ma_variable_1 = 1
    #  ma_variable_2 = 2 pour vérifier son absence dans le module
    ma_variable_3 = 3
     
    if __name__ == '__main__':
        # obtenir une liste de tous les membres du module
        module = __import__(nom_module)
        membres = inspect.getmembers(module)
     
        # filtrer les membres qui correspondent aux noms de variables souhaités
        variables_presentes = [
            nom_variable for nom_variable, _ in membres
            if nom_variable in noms_variables
        ]
     
        print(variables_presentes)
    Je sais qu'en python on privil�gie souvent le simple, mais attention, le simple peut �tre souvent trop simple pour �tre robuste et �viter certaines failles, comme la s�curit� par exemple.
    Je conseille de mani�re assez soutenue de ne pas utiliser eval ou globals qui sont sources de bugs assez difficiles � debug.

  11. #11
    Expert confirm� Avatar de papajoker
    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 324
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ni�vre (Bourgogne)

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 324
    Par d�faut
    bonjour
    Citation Envoy� par N_BaH Voir le message
    j'ai une liste de cha�nes, qui sont des noms de variables. Ces variables peuvent ne pas �tre assign�es*, et je voudrais les tester.
    * ne me demandez pas pourquoi, c'est pour le d�couvrir que je voudrais les tester.
    les eval() et globals() c'est quand m�me ce qui se fait de plus moche en python !


    Tu devais "normalement" utiliser un dictionnaire : ton nom de variable devient (juste) une cl� pour ce dictionnaire
    note: globals() retourne justement un dico

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     dico = {}
    dico["toto"] = 1
    dico["tata"] = 2
     
    for cle in dico:
        print("simili nom de variable bash", cle, "valeur:", dico[cle])
     
    if not "truc" in dico :
         print("clé/variable 'truc' existe pas")
    ----------
    je fais des requ�tes HTTP (requests.get(...)), et parfois, sans �chouer pourtant, la r�ponse semble vide...
    D�sol�, mais ceci ne devrait avoir aucun rapport avec ta demande et ... une r�ponse vide ce n'est pas une variable inexistante.
    Tu as sans doute plus besoin de corriger ton code en amont que d'ajouter une mauvaise rustine sur un mauvais code.

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2006
    Messages
    12 849
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 12 849
    Billets dans le blog
    1
    Par d�faut
    Citation Envoy� par N_BaH Voir le message
    je fais des requ�tes HTTP (requests.get(...)), et parfois, sans �chouer pourtant, la r�ponse semble vide...
    ...comme je l'ai dit, quand je conna�trai la raison de cette absence, cela n'aura pas de raison de rester.
    Je suis d�sol�, je ne vois pas le lien entre un retour de requests.get(...) vide et une variable non existante.

    Force est de constater que tu n'es pas super clair. Alors j'essaye d'extrapoler pour comprendre Imaginons que ce soit un truc du style...
    Code python : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    nomVar1=requests.get(url1)
    nomVar2=requests.get(url2)
    ... dans les deux cas, les variables existent et contiennent quelque chose (le retour de la fonction requests.get() et une fonction retourne toujours quelque chose, m�me si elle n'a aucun return dans son code elle retourne quand-m�me la valeur None donc quoi qu'il arrive les variables existent et ont une valeur testable). Et si c'est pas None mais une string vide alors �a reste quand-m�me une string.
    Accessoirement on peut voir/debugguer un retour vide d'un retour None
    Code python : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    >>> print("[%s]" % "")
    []
    >>> print("[%s]" % None)
    [None]

    PS: ce code...
    Code python : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    nomVar1=requests.get(url1)
    nomVar2=requests.get(url2)
    ... peut s'�crire nomVar=tuple(request.get(x) for x in (url1, url2)) et on r�cup�re un tuple (sur lequel on peut appliquer des traitements it�ratif) plut�t que n variables "nomVar1", "nomVar2", ..., "nomVarN" surtout que tu vas ensuite les copier dans un tuple pour les traiter.
    Mon Tutoriel sur la programmation �Python�
    Mon Tutoriel sur la programmation �Shell�
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les diff�rentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Mod�rateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    F�vrier 2008
    Messages
    7 672
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 7 672
    Par d�faut
    ne vous �nervez pas.

    j'en suis au stade �chafaudage en mode Frankenstein. Cette monstruosit�, je le sais, est une usine � gaz fumeuse et naus�abonde, qui tient avec de la ficelle et des bouts de bois, et des rustines par-dessus pour limiter les fuites.
    et je barbote au milieu de toute cette m... �a, me prenant tant�t pour Nemo �chou� au fond de l'oc�an, tant�t pour le roi Soleil devant ses grandes eaux.

    au d�but, �a devait pourtant �tre tr�s simple ! au d�but.
    �a devait �tre pli� en trois commandes, mais � force de vouloir bien faire...

    ne vous inqui�tez pas.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Premiers pas dans python
    Par thance dans le forum G�n�ral Python
    R�ponses: 20
    Dernier message: 13/03/2007, 16h54
  2. integrer du code Assembleur (x86) dans python
    Par nephhh dans le forum G�n�ral Python
    R�ponses: 2
    Dernier message: 11/02/2007, 11h50
  3. Masquer une commande syst�me dans python
    Par Mysti� dans le forum G�n�ral Python
    R�ponses: 5
    Dernier message: 03/11/2006, 16h33
  4. premiers pas dans Python - palindrome
    Par tarang dans le forum G�n�ral Python
    R�ponses: 1
    Dernier message: 31/10/2006, 16h56
  5. Utilisation de Timer dans Python
    Par aliassaf dans le forum G�n�ral Python
    R�ponses: 5
    Dernier message: 17/06/2006, 19h06

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