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 :

String en tant que variable [Python 3.X]


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 4
    Points : 4
    Points
    4
    Par défaut String en tant que variable
    Bonjour,


    Avant de vous présentez mon soucis voilà quelques infos pour mieux comprendre:
    - j'ai commencé le code via python il y a une semaine
    - j'ai décidé de faire un mini-jeu RPG textuel pour m'aider a comprendre et maitriser les concepts.

    Dans ce jeu, vous êtes un personnage évoluant dans un univers défini et qui possède (entre autres):
    - une bourse d'argent
    - un inventaire qui se décompense en un inventaire d'équipement et un de consommable soin

    Lorsque j'appelle ma "achat", il y a deux grandes étapes:
    - une étape qui réduit la valeur de ma bourse
    - une étape qui insère l'achat dans mon inventaire (et c'est ici que ça coince)

    Pour la suite, nous prendrons l'exemple du "chapeau pointu" qui s'achète chez le tailleur pour 10 sous et qui possède le refcode= "T_1"

    J'ai une liste de tuple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #Create the shop inventory as list of tuple (<name>, <cost>, <refcode in all item>)
    #Tailor
    inventaire_tailleur= [
    	("Chapeau pointu", 10, "T_l"),
    	("Casque à pointes", 45,"T_2"),]
    J'ai fait par ailleurs dans un autre module une classe mère "item" avec deux classes filles "equipement" & "consum":

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #Item category allowed for check
    item_category = ["weapon", "taillor", "shoe", "jewel","consum"]
    #_____________________________________________________________________________________________________________________________
     
     
    class item: #All kind of item class (that could be equipement or consumable)
    	def __init__(self, item_name, item_type):
    		self.name = item_name
    		self.type = item_type
     
    	def __check__(self, item_name, item_type):
    		if self.type in item_category:
    			return "{} {}".format(self.name, self.type)
    		else:
    			print("Erreur sur le type de l'item <{}>! Ne peut être que <arme> ou <consum> !".format(self.type))
    			exit()
     
     
     
     
    class equipement(item): #All kind of equipement which are items
    	def __init__( self, item_name, item_type,item_PDV,item_ATK,item_DEF):
    		item.__init__(self, item_name, item_type)
    		item.__check__(self, item_name, item_type)
    		self.PDV = item_PDV
    		self.ATK = item_ATK
    		self.DEFe = item_DEF
     
    	def __str__(self):
    		return "Equipement: {}. Bonus: {} PDV, {} ATK, {} DEF.".format(self.name, self.PDV,self.ATK, self.DEFe)
     
     
     
    class consum(item): #All kind of consummable which are items too
    	def __init__(self,item_name, item_type,item_PDV):
    		item.__init__(self, item_name, item_type)
    		item.__check__(self, item_name, item_type)
    		self.PDV = item_PDV
     
    	def __str__(self):
    		return "Consommable: {} qui vous soignera de {} PDV".format(self.name, self.PDV)
    mais également j'ai noté l'ensemble de équipement de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #A) Equipement (name, type, PDV, ATK, DEF)
    T_1 = equipement("chapeau poitu","taillor", 0, 0,0)
    T_2 = equipement("casque à pointes","taillor", 0, 0,0)

    Mon soucis se situe sur la ligne rouge, de ma fonction "buy_item":
    AttributeError: 'str' object has no attribute 'type'

    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
    25
    def buy_item (joueur,artisan,inventaire_artisan,item_buy):	
    	achat=False
    	while not achat:
    		for (produit,price,item_code) in inventaire_artisan:
    			if str.lower(item_buy) == str.lower(produit):
    				answer = input("Confirmez-vous l'achat de {}. Oui/Non: ".format(produit))
    				if str.lower(answer) == "oui":
    					if joueur._money < price:
    						PNJ.dialogue("Le " + str(artisan),"Je pense que cet article est trop cher pour vous... Ce n'est rien, à bientôt")
    						achat= True
    						break
    					else:
    						print("Vous achetez {} au prix de {} sous !".format(produit,price))
    						joueur._money = joueur._setmoney(-price)
    						inventory.add_inventory (joueur,item_code)
    						achat= True
    						break
    				else: 
    					PNJ.dialogue("Le " + str(artisan),"Ce n'est rien, à bientôt")
    					achat= True
    					break
    		else:
    			PNJ.dialogue("Le " + str(artisan),"Cet objet n'existe pas dans ma boutique !")
    			achat= True
    			break
    Je comprends bien "item_code" (reference produit) est de type string car retourné du tuple vert alors que "inventory.add" attend une réference produit de type variable tel que défini en orange.
    Comment faire en sorte que la reference produit en tant que str soit converti en variable ?


    Merci de votre aide,

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    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 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Salut,

    Citation Envoyé par qleroy Voir le message
    Comment faire en sorte que la reference produit en tant que str soit converti en variable ?
    Les dictionnaires sont la "bonne" structure pour associer chaîne de caractères et objet quelconque.
    Ils se cachent d'ailleurs derrière variables et attributs.

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

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bonsoir,

    Merci de votre retour.

    J'aurais aimé éviter de faire un "dictionnaire de passage" de type:
    dict ("coderef":coderef)

    Pour faire un passage de string a objet

    Mais s'il n'exite pas d'autre solution je serais obligé de passer par là.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par qleroy Voir le message
    Comment faire en sorte que la reference produit en tant que str soit converti en variable ?
    Si j'ai bien compris, ton problème se réduit à ceci: t'as une variable qui contient une valeur (ie toto=123) et t'as une seconde variable qui contient le nom de la première (ie xxx="toto"). Et tu veux passer de xxx à 123.
    Alors je ne vais pas te mentir: à la base c'est possible en passant par eval() qui convertit une string en ordre Python. Donc un truc ressemblant à eval("print(%s)" % xxx) te donnera 123.
    Mais ton vrai souci c'est que ton impasse provient d'une erreur de conception. Normal, avec une semaine d'expérience. Et eval() n'a pas été faite pour pallier à ce genre de souci. Ok tu peux passer à ta fonction eval("T_1") et ça fonctionnera mais tu feras que masquer le souci qui ressortira plus tard multiplié par 100000.

    Déjà mettre T_1=... puis T_2=... c'est pas bon. Tous les langages un minimum évolués depuis 50 ans possèdent des tableaux qui permettent justement de séquencer les choses sans se prendre la tête à leur trouver un numéro ; et de traiter ces séquences par un algo unique commun. Tu aurais écrit T sous forme de tableau (ou de liste car c'est son nom dans Python) tu n'aurais plus eu de souci. Tu récupérais chez ton marchand l'indice "i" de l'achat et ensuite tu passais cet indice à ta fonction qui pouvait alors traiter le T[i] correspondant sans te prendre la tête avec ta string qui doit devenir variable.
    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]

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    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 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Citation Envoyé par qleroy Voir le message
    J'aurais aimé éviter de faire un "dictionnaire de passage" de type:
    dict ("coderef":coderef)

    Pour faire un passage de string a objet
    C'est implicite avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    T_1 = equipement("chapeau pointu","taillor", 0, 0,0)
    T_2 = equipement("casque à pointes","taillor", 0, 0,0)
    Le dictionnaire s'appelle alors globals().

    Mais on évite de polluer l'espace de nom global avec ce genre de choses pour écrire:
    d = { k: equipement(v,"taillor", 0, 0,0) for k, v in ("chapeau pointu", 'T_1'), ("casque à pointes", 'T_2') }
    où mieux construire le dictionnaire à partir de inventaire_tailleur.

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

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2020
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci à tous les deux.

    En effet, ayant commencé ce projet très rapidement lors de ma formation. Je me rends compte que de plus en plus de chose que j'avais codé au début sont déjà obsolètes avec les connaissances que j'ai maintenant... et ça ne fait qu'une seule semaine que j'ai commencé.
    N'ayant pas envie de recommencer 20 fois ce projet, j'essaye de bricoler pour le moment et j'en ferais une version plus propre quand j'aurais acquis un maximum de skills.


    Pour le moment j'ai utilisé un dictionnaire de passage qui fait très bien l'affaire (et sera obsolète si on souhaite créer une infinité d'objet par la suite).

    Merci pour vos conseils, je vais regarder tous de mêmes vont solutions pour plus tard.
    Pensez vous qu'il me fera possible de publier l’entièreté du projet ici lorsqu'il sera bien avancé et réécris proprement (d'ici plusieurs semaines) pour que des membres plus aguéris puissent me dire ce qu'il est perfectible ? (surement a peu prêt tout ahah)

    Bonne journée
    Q

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par qleroy Voir le message
    Pensez vous qu'il me fera possible de publier l’entièreté du projet ici lorsqu'il sera bien avancé et réécris proprement (d'ici plusieurs semaines) pour que des membres plus aguéris puissent me dire ce qu'il est perfectible ?
    Pas ici. Enfin c'est possible mais t'as une rubrique plus dédiée à ça.
    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]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/05/2010, 16h25
  2. [OPTIMISATION] Date en tant que variable dans les clauses WHERE
    Par dens19 dans le forum Développement
    Réponses: 11
    Dernier message: 18/09/2009, 08h57
  3. [AC-2000] Déclarer une procédure en tant que variable dans une procédure globale
    Par kir4000 dans le forum VBA Access
    Réponses: 1
    Dernier message: 04/08/2009, 16h52
  4. %Path% en tant que variable User
    Par _dack_ dans le forum Windows XP
    Réponses: 1
    Dernier message: 05/02/2008, 21h05
  5. Réponses: 2
    Dernier message: 06/12/2007, 19h47

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