2010-12-06 3 views
1

Je python apprendre et je veux apprendre les bonnes pratiques dès le début j'ai eu un problème et je suis venu avec une solution qui implique la génération des variables sur l'exécution, c'est un échantillon de ce que je faisais(python) génère et exécute du code à l'exécution considéré comme une mauvaise pratique?

for i in range (10): 
    current = 'variable'+str(i)+' = '+str(i) 
    exec (current) 

Donc, fait des choses comme cela est considéré comme une mauvaise pratique, je sais que c'est un exemple simple mais je peux voir cela se compliquer si vous incluez des objets dans le mélange, je suis mauvais pour déterminer le bon code lisible débutant après tout) donc je vous demande aux vétérinaires si cela est désapprouvé sur ce que sont les moyens préférés pour gérer des situations comme celle-ci.

+2

Réponse courte: oui, c'est * vraiment * mauvaise pratique. –

Répondre

4

Non, ce n'est pas une bonne pratique. Quoi que vous fassiez, la solution est probablement de mettre vos données dans un dict, alors vous pouvez simplement accéder à mydict ['variable1'] ou quoi que ce soit.

Il y a des moments où exec est raisonnable, mais ce sont typiquement des cas de métaprogrammation avancée.

Une directive ici: Si vous ne savez pas exactement pourquoi vous le faites, et pourquoi il n'y a pas d'autre moyen, ne le faites pas.

+1

"et pourquoi il n'y a pas d'autre moyen, ne pas." Tant de fois ça! – SingleNegationElimination

4

Je suis à peine un vétérinaire, mais le problème que je vois à ce sujet sont:

  • Lisibilité, comme vous le mentionnez. Il est également difficile de déboguer car le code buggy pourrait être assemblé de partout.

  • Erreurs de syntaxe lors de l'exécution. C'est encore plus ennuyeux, selon mon expérience, que des erreurs logiques.

  • L'injection de code, et celui-ci est le tueur. Comment vous assurez-vous que current ne code pas que vous ne voulez pas exécuter? (Ces applications web: un utilisateur distant peut essayer d'effacer vos données.) En pratique, vous devez être très sûr que le courant n'inclut pas quelque chose qui vient de l'entrée de l'utilisateur qu'il est généralement plus rapide et plus sûr de trouver je le fais.

4

La bonne façon de gérer plusieurs quantités liées est de les mettre dans un type approprié de conteneur. Cela s'applique quelle que soit la langue que vous utilisez.

En Python, les conteneurs normaux sont des listes, des tuples et des dicts. Vous choisissez en fonction de ce que vous allez faire avec le contenu.

De plus, vous pouvez créer une nouvelle liste de toute sorte de données « à motifs » ou « transformées » facilement avec une compréhension de la liste:

number_strings = [str(i) for i in range(10)] 
# number_strings is a list of 10 values, each of which is a string 
# representation of the numbers 0 through 9 inclusive. range(10) creates a 
# list of 10 values, being the integers 0 through 9; we then process that 
# list with the list comprehension, transforming each integer with 'str'. 
+0

Ce qu'il faisait était simplement 'number_strings = range (10)' - pensez à ce que str (i) fait dans exec. –

+0

@Chris: bon point. :) –

Questions connexes