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 :

Variables dynamiques en python 3


Sujet :

Python

  1. #1
    Membre confirmé
    Variables dynamiques en python 3
    Bonjour,

    Est il possible de créer dynamiquement des variables avec Python 3 ?

    Par exemple en php, on peut faire cela :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $var = 'ma_variable_dynamique';
    $$var = 'toto';
    echo $ma_variable_dynamique; // retourne toto


    Existe-t-il un équivalent en Python ?
    Merci de vos lumières

  2. #2
    Membre éprouvé
    Comme quoi, PHP est loin d'enseigner les bonnes pratiques.

    Mais si tu y tiens vraiment...
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> locals()
    {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}
    >>> locals()['hello'] = 'haha'
    >>> hello
    'haha'

  3. #3
    Membre extrêmement actif
    Salut Antoine,



    Comme quoi, PHP est loin d'enseigner les bonnes pratiques.
    Est-ce que tu pourrais développer stp ?

  4. #4
    Modérateur

    Salut,

    L'exemple d'Antoine pourrait être plus proche de PHP en l'écrivant ainsi:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    var = 'ma_variable_dynamique';
    locals()[var] = 'toto';
    print ma_variable_dynamique; // retourne toto


    Mais bon locals() est un dict comme un autre et il n'est pas choquant d'écrire:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dd = dict()
    var = 'ma_variable_dynamique';
    dd[var] = 'toto';
    print dd['ma_variable_dynamique']; // retourne toto


    Ce qui fait que la variante locals est plus glauque que la variante dict relève de l'infame Mr "Side Effect" dont nous parlions dans un autre topic.

    Ce fut une mauvaise pratique dans PHP car certaines variables pouvaient être modifiées par injection via les query string des requêtes HTTP.
    Les nouvelles versions de PHP mettent cela dans des dictionnaires avec différents attributs qui bloquent les modifications.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre éprouvé
    Citation Envoyé par eyquem Voir le message
    Est-ce que tu pourrais développer stp ?
    Outre le fait que cela peu causer des grosses failles de sécurité selon la configuration de PHP (encore aujourd'hui d'ailleurs), c'est surtout une porte ouverte aux bugs et aux conceptions biscornues.

    Imagine, tu as un bug quelque part.
    Tu sais que le souci c'est le contenu de la variable
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    $$la_variable

    qui est injectée dans une fonction.

    Mais, aha ! Quelle est cette fameuse variable ?
    Va falloir rajouter un print dans ton code. Pas grave, mais c'est casse pieds.
    Après, faudra savoir où est déclarée cette variable. Comme avec PHP, tout les fichiers que tu inclus peuvent rajouter du brol dans ton namespace global, c'est très vite le bazard.

    Et des perles comme ça, tu peux en trouver plein dans PHP.
    Par exemple, il est logique qu'on ne puisse pas faire ça:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    false['abracadabra']

    Par contre, ce qui suit est tout à fait légal, et est même documenté (à croire qu'ils en sont fiers)
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    $var = false;
    $var['abracadabra']; // qui retournera Null


    Et puis ya qu'à voir les classes inutiles qu'ils ont collé, les itérateurs mal pensés, et j'en passe des meilleures. C'est à croire que les devs de PHP n'ont pas bien compris l'orienté objets.


    Voilà, pour moi, PHP*est un langage poubelle.
    Hélas, c'est aussi le seul langage à être largement disponible sur les serveurs web. Alors on fait avec, comme tout le monde.

  6. #6
    Membre confirmé
    Merci pour vos réponses.

    Antoine a un avis tranché, mais je suis d'accord, les variables dynamiques sont vraiment compliqué à débugger, sans parler des problèmes de sécurité.

    Autant donc ne pas les utiliser, mais j'avoue que dans certains cas (tout au moins celui ayant suscité cette question pour moi), c'est assez commode : programme très court (débugage hyper facile), usage interne exclusivement (pas de problème de sécu), toujours plus pressé quand c'est pour soi que quand c'est pour les autres (mode fainéant ...)

  7. #7
    Membre expérimenté
    Bonjour.
    Citation Envoyé par max-mag
    Antoine a un avis tranché, mais je suis d'accord, les variables dynamiques sont vraiment compliqué à débugger, sans parler des problèmes de sécurité.

    Autant donc ne pas les utiliser, mais j'avoue que dans certains cas (tout au moins celui ayant suscité cette question pour moi), c'est assez commode : programme très court (débugage hyper facile)...
    Peux-tu donner un exemple concret et court ? Ce serait pour voir si cela est vraiment plus pratique.

  8. #8
    Membre confirmé
    J'ai un script php qui fait de l'extraction de données. Ce script est très long, du fait notamment des latences des sites web concernés et ma volonté de pas faire quelque chose de trop agressif (le but étant d'extraire leurs catalogues produit et de les afficher dans un comparateur, inutile de faire blacklister l'outil ...).

    Ce script passe donc en revue x sites à l'aide d'une boucle for. Php ne gérant pas plusieurs threads (ou du moins, c'est très compliqué), pour accélérer les choses, je dois lancer plusieurs threads en simultanés (1 thread par site à analyser).

    Le script étant assez lourd désormais, et même s'il n'est désormais plus utilisé sur un site web, passer à un autre langage n'est pas à l'ordre du jour, cela serait trop long.

    L'idée est donc la suivante, je met la boucle for dans un script python, j'ouvre un thread pour lancer le script php avec son paramètre.
    Chaque thread a un nom différent, dynamique.
    Le résultat fait quelques lignes seulement et me permet de lancer facilement mes scripts php en une seule fois.

    J'ai même fait plus "fainéant", le nom du thread est le nom du paramètre passé au script php (unique), issu du for.

  9. #9
    Membre expérimenté
    J'entends bien. Mais pourquoi aurais-tu besoin d'une variable dynamique en Python ?