Montrez votre code ça sera plus simple, y compris le message d'erreur si il existe.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
mais si vous allez dans cette direction, c'est probablement parce que vous posez très mal le problème de départ. Une solution plus élégante serait d'avoir un dictionnaire spécifique comme cases et des index comme 'A1' pour pouvoir écrire cases['A1'].
C'est la fonction eval qui est la solution la plus directe : elle prend une chaîne de caractères, qui représente une expression, et l'évalue.
# on construit une expression dans une chaine
expression = "2"
expression += "+3"
# on affiche l'expression et sa valeur
print("l'expression", expression, "vaut", eval(expression))
Mais comme dit plus haut, c'est une idée qui sent le problème XY :
vous voulez peut être faire un truc avec différentes "cases" A1, A2, B3, C4 qui contiennent des valeurs (c'est le problème X)
vous pensez vous en tirer avec des variables nommées caseA1, caseB2, etc
mais vous ne savez pas comment accéder aux valeurs à partir des coordonnées A1, B2, contenues dans des chaines (c'est un autre problème Y) vous voulez une formule magique pour faire ça.
OK, il y a une formule magique (eval(chaine)), techniquement ça marche mais c'est pas la bonne approche.
Une solution correcte du problème X, c'est d'employer un dictionnaire
# on crée le dictionnaire "case" et on y met des trucs
case = {}
case["A1"] = 12
case["B2"] = 34
case["C44"] = 1789
# et maintenant on y accède à partir d'un nom
nom = "B2"
print("la case", nom, "contient", case[nom]);
Exécution
Python 3.11.2 (main, Nov 30 2024, 21:22:50) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
la case B2 contient 34
>>>
Une solution correcte du problème X, c'est d'employer un dictionnaire
Les variables caseA1, caseB2, caseC44,... étant déjà des clefs du dictionnaire globals(), le dictionnaire est déjà là (pour peu qu'on sache qu'il existe et comment utiliser un dictionnaire).
Poser correctement le problème est de considérer caseA1, caseB2, caseC44,... comme éléments d'une collection (de cases). On peut très bien matérialiser cette collection par les variables préfixées par "case..." (un sous ensemble du dictionnaire globals()) ou en lui dédiant un dictionnaire spécifique et dédié (cases).
Je préfère le dictionnaire dédié pour éviter de me poser des questions sur les doublons/collisions dans le nom des variables. Ce qui pourrait compliquer la mise au point du code (et la simplification de l'écriture).
Une solution correcte du problème X, c'est d'employer un dictionnaire
Les variables caseA1, caseB2, caseC44,... étant déjà des clefs du dictionnaire globals(), le dictionnaire est déjà là (pour peu qu'on sache qu'il existe et comment utiliser un dictionnaire).
Poser correctement le problème est de considérer caseA1, caseB2, caseC44,... comme éléments d'une collection (de cases). On peut très bien matérialiser cette collection par les variables préfixées par "case..." (un sous ensemble du dictionnaire globals()) ou en lui dédiant un dictionnaire spécifique et dédié (cases).
Je préfère le dictionnaire dédié pour éviter de me poser des questions sur les doublons/collisions dans le nom des variables. Ce qui pourrait compliquer la mise au point du code (et la simplification de l'écriture).
Le dictionnaire est la solution la plus simple, et la plus propre, et c'est donc à préférer. Même si techniquement c'est possible de faire autrement. Techniquement je peux programmer avec des gants et des lunettes noires, je préfère pas. Faut éviter les trucs pervers.
Devoir concaténer un préfixe et le nom de la case à chaque accès, puis aller chercher dans le dictionnaire global ? Quel intérêt à faire ce détour ?
J'avais effectivement utilisé un dictionnaire mais je trouvais ça lourd. La façon proposée d'utiliser le dictionnaire est bien plus élégante que celle que j'avais imaginé et c'est celle que je vais utiliser, même si la solution print(globals()[variable]) est la solution théorique que je cherchais.
Troyver "lourd" ça le fait souvent quand on patauge à apprend à utiliser un truc qui résoud un problème pour lequel on a déjà une solution en vue fut-elle inefficace ou tarabiscotée, avec les moyens techniques qu'on connaît déjà. Forcément, on apprend des trucs nouveaux, qu'on connaissait pas avant, et ça n'a pas l'air indispensable.
Pour en revenir au choix de la structure de données, le truc du globals et les noms de variables caseb2, un truc qui sera emmerdant, ça sera de faire une boucle sur l'ensemble des cases
Alors que
case = {}
case["a1"] = 12
case["b42"] = 34
case["c33"] = 54
for position, valeur in case.items():
print(position, "=>", valeur)
ça le fait tout seul
Python 3.11.2 (main, Nov 30 2024, 21:22:50) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
a1 => 12
b42 => 34
c33 => 54
>>>
- Edité par michelbillaud 3 mars 2025 à 8:45:05
Transformation d'une variable de type string
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)