Récupérer une variable prédéfinie comme input [Résolu]

Signaler
-
 Ziomix -
Bonjour,

Je suis nouveau en programmation et surtout en python et j'ai un projet obligatoire à faire.

Je vous explique : J'ai une liste d'objets (ce sont des personnes), chacun avec des caractéristiques, chaque caractéristique est basée sur une échelle de 1 à 5 (pas important pour comprendre le problème) donc j'ai 6 hommes et 6 femmes prédéfinis comme objets, je les compare en fonction de leurs caractéristiques, si leurs caractéristiques sont proches elles seront plus ou moins une correspondance parfaite.

Mon but est donc de saisir les noms des personnes que j'entre par un input et ensuite ma fonction de comparaison les compare. Le problème est que lorsque je compare manuellement en saisissant directement les noms, cela fonctionne mais lorsque j'insère un input, une erreur se produit.

Je vous laisse découvrir le code pour mieux comprendre ce que je dis car je ne sais pas si je suis très compréhensible mais je serais très heureux d'avoir une réponse à ce problème, merci :D

PS:Oui c'est sur le projet des 10 couples parfaits pour ceux qui ont reconnus ^^'

class Candidat: #Subject class (characteristics)
def __init__(self,genre,humour,physique,intelligence,projet):
self.genre=genre
self.humour=humour
self.physique=physique
self.intelligence=intelligence
self.projet=projet


def compare(Test1,Test2): #comparison function

#Match à 100% :

if Test1.humour==Test2.humour and Test1.physique==Test2.physique and Test1.intelligence==Test2.intelligence and Test1.projet==Test2.projet:
print("Match Parfait : 100%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match")

#Match à 75% :

if Test1.humour!=Test2.humour and Test1.physique==Test2.physique and Test1.intelligence==Test2.intelligence and Test1.projet==Test2.projet:
print("Match Parfait : 75%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match1")

if Test1.humour==Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence==Test2.intelligence and Test1.projet==Test2.projet:
print("Match Parfait : 75%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match2")

if Test1.humour==Test2.humour and Test1.physique==Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet==Test2.projet:
print("Match Parfait : 75%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match3")

if Test1.humour==Test2.humour and Test1.physique==Test2.physique and Test1.intelligence==Test2.intelligence and Test1.projet!=Test2.projet:
print("Match Parfait : 75%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match4")

#Match à 50% :

if Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence==Test2.intelligence and Test1.projet==Test2.projet:
print("Match Parfait : 50%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match01")

if Test1.humour!=Test2.humour and Test1.physique==Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet==Test2.projet:
print("Match Parfait : 50%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match02")

if Test1.humour!=Test2.humour and Test1.physique==Test2.physique and Test1.intelligence==Test2.intelligence and Test1.projet!=Test2.projet:
print("Match Parfait : 50%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match03")

if Test1.humour==Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet==Test2.projet:
print("Match Parfait : 50%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match04")

if Test1.humour==Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence==Test2.intelligence and Test1.projet!=Test2.projet:
print("Match Parfait : 50%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match602")

if Test1.humour==Test2.humour and Test1.physique==Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Match Parfait : 50%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match103")


#Match à 25% :

if Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet==Test2.projet:
print("Match Parfait : 25%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match001")

if Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence==Test2.intelligence and Test1.projet!=Test2.projet:
print("Match Parfait : 25%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match002")

if Test1.humour==Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Match Parfait : 25%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match003")

if Test1.humour!=Test2.humour and Test1.physique==Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Match Parfait : 25%")
elif Test1.humour!=Test2.humour and Test1.physique!=Test2.physique and Test1.intelligence!=Test2.intelligence and Test1.projet!=Test2.projet:
print("Mauvais Match004")

Bryan=Candidat("homme",4,5,3,2)
Adrien=Candidat("homme",4,3,2,3)
Marin=Candidat("homme",5,2,4,3)
Alcaraz=Candidat("homme",4,3,2,1)
Allan=Candidat("homme",4,3,2,1)
SebyDaddy=Candidat("homme",4,3,2,1)
#--------------------------------#
Anissa=Candidat("femme",0,5,2,0)
Melanie=Candidat("femme",5,3,4,3)
Dita=Candidat("femme",4,4,3,2)
LeaMary=Candidat("femme",4,3,2,1)
Maissane=Candidat("femme",4,3,2,1)
Kellyn=Candidat("femme",4,3,2,1)

Candidat=input("Homme : ")#input Man
Candidat=input("Femme : ")#input Woman
compare(Test1,Test2)#comparing

'''If I write 'compare(Bryan,Dita)' for exemple, It's directly the subjects, it's working'''


Configuration: Windows / Chrome 85.0.4183.121

5 réponses

Messages postés
29912
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
31 octobre 2020
2 909
Bonjour,
Je ne fais pas de python... mais... Truc tout bête.... à tout hasard...
Candidat=input("Homme : ")#input Man
Candidat=input("Femme : ")#input Woman
compare(Test1,Test2)#comparing

Ca ne serait pas plutôt
Test1=input("Homme : ")#input Man
Test2=input("Femme : ")#input Woman
compare(eval(Test1),eval(Test2))#comparing

Messages postés
216
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
31 octobre 2020
12
Salut,
Jordane est peut-être un génie mais je te conseille de taper : danger eval python sur un moteur de recherche.
Exemple : https://stackoverflow.com/questions/1832940/why-is-using-eval-a-bad-practice
je ne suis pas prof, par contre, si je l'étais, je vois un eval sur une copie, je la démonte. En gros, je ne donne même pas la moyenne.
L'utilisation d'instructions dangereuses c'est comme un HS sur une dissertation.
Messages postés
419
Date d'inscription
vendredi 25 septembre 2015
Statut
Membre
Dernière intervention
20 octobre 2020
202
Bonjour,
Je suis d'accord avec vous sur le fait que eval est généralement à éviter dans un code python, cependant, je pense qu'il faut relativisé le danger.
Si eval est déconseillé, c'est en premier lieu car elle permet à l'utilisateur d'executer n'importe quel code arbitrairement et cela peut constituer une faille de sécurité. Cependant, ce n'est pas un code qui sera accessible à distance. Pour pouvoir l'executer il faudra être déjà connecté à la machine, et dans ce cas on n'a pas besoin de ce code python pour faire ce que l'on veut.
Et pour ce qui concerne la propreté du code et sa robustesse, je pense que l'on peut faire tout autant de reproche à votre solution (bien qu'elle réponde parfaitement à la question posée). Par exemple si l'utilisateur entre le nom d'un candidat qui n'existe pas, le programme plante. Pour un programme en production, ce n'est pas mieux que le programme de Jordane.

Loin de moi l'idée de vous critiquer, mais je voulais juste indiquer que l'utilisation du eval dans ce contexte, sachant qu'il s'agit d'un exercice, n'est à mon avis pas à rejeté avec autant de femeté :)

Je vous souhaite une très bonne soirée.
Messages postés
216
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
31 octobre 2020
12 >
Messages postés
419
Date d'inscription
vendredi 25 septembre 2015
Statut
Membre
Dernière intervention
20 octobre 2020

Dans ce contexte oui. Mais je pense que lors d’un exercice, il faut penser au pire.
>
Messages postés
216
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
31 octobre 2020

Merci à vous dachiasse en tout cas pour cette superbe aide très instructive et complète, je m'en inspirerais pour mes prochains projets :) C'est super cool qu'il y ai toujours des gens pour répondre à nos questions dans les forums !
Merci, bonne fin de soirée
Messages postés
216
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
31 octobre 2020
12
Voici ma proposition. Aucun eval, un algorithme de comparaison de moins de 20 lignes.
Je n'ai pas géré l'erreur du prénom inexistant dans le dictionnaire.

from itertools import zip_longest

# un dictionnaire avec comme paire clé, valeur : prénom du candidat, son instance
dico_candidat = {}
class Candidat:
    # l'attribut prenom permet l'ajout du candidat dans le dictionnaire
    # l'attribut *caracteristiques est un tuple d'une longueur définie dynamiquement après instanciation
    # cet attribut contient des éléments de type entier (plus facile et plus rapide à calculer pour le processeur)
    def __init__(self, prenom, masculin, *caracteristiques):
        self.prenom = prenom
        self.masculin = masculin
        self.caracteristiques = caracteristiques
        dico_candidat[self.prenom] = self

    def comparer(self, other, toutes=False): # je te laisse te faire plaisir dans l'algo de cette méthode
# mais, force est de constater que la mienne fait une quinzaine de lignes, la tienne en fait à peu près 150
            resultat = 0
            if not toutes: # dans le cas où on ne compare que les n premières caractéristiques inscrites
                for self_carac, other_carac in zip(self.caracteristiques, other.caracteristiques):
                    resultat += abs(self_carac - other_carac)
            else: # dans ce cas, toute caractéristique non inscrite par le candidat prend la valeur de -11 (nombre arbitraire)
                for self_carac, other_carac in zip_longest(self.caracteristiques, other.caracteristiques, fillvalue=-11):
                    resultat += abs(self_carac - other_carac)
            if resultat == 0:
                print("100%")
            if 0 < resultat < 4:
                print("75%")
            if 4 <= resultat < 8:
                print("50%")
            if 8 <= resultat < 17:
                print("25%")
            if resultat >= 17:
                print("0%")        

# J'ai volontairement mis un nombre de caractéristiques différent pour chaque candidat
Bryan = Candidat("Bryan", True, 2,3,3,2,1,3,4,5,5,5)
Adrien = Candidat("Adrien", True, 4,5,5,5,4,0,0,4)
Anissa = Candidat("Anissa", False, 5,3,5,0,0,2)
Melanie = Candidat("Melanie", False, 4,5,5,5,5,4,4,2,0,3,4,4,5)


# si tu compares ces 2 candidats, tu obtiendras 100 %
Alcaraz = Candidat("Alcaraz", True, 4,3,2,1)
LeaMary = Candidat("LeaMary", False, 4,3,2,1)

print(dico_candidat.keys())

homme = input("Tapez un prénom masculin dans le dictionnaire : ")
femme = input("Tapez un prénom féminin dans le dictionnaire : ")

# Dans tes input, tu ne compares que des personnes de sexe opposé.
if dico_candidat[homme].masculin == dico_candidat[femme].masculin:
    print("Cette version permet de ne comparer que deux personnes de sexes opposés.")
else:
    print("Si vous voulez comparez toutes les caractéristiques\n(certaines personnes ont omis des caractéristiques), répondez oui.")
    print("Toute autre réponse équivaut à un non")
    toutes = input("Toutes les caractéristiques ? (oui ?) : ")
    if toutes.strip().lower() == "oui": # nettoie la donnée reçu, "   OUi   " devient "OUi" après strip() puis "oui" après lower()
        dico_candidat[homme].comparer(dico_candidat[femme], True)
    else:
        dico_candidat[homme].comparer(dico_candidat[femme])
Comment dire, tu ne fais peut-être pas de python(ce qui m'étonne) mais t'es un putain de génie mec, ça marche merciiiiiiiii, c'était vraiment tout simple en plus (enfin pour toi). J'ai également trouvé une solution sur un forum anglophone mais qui pour le coup était plus compliqué à comprendre et plus longue :)
Merci encore !!
Messages postés
29912
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
31 octobre 2020
2 909
Je fais d'autres langage de programmation.... Ça aide.
Ce n'est qu'une question de logique. Il n'est pas si compliqué de passer d'un langage à un autre.
Bonne soirée.
Merci beaucoup, ça marche également c'est une autre méthode qui marche très bien et qui est très complète, Merci Dachiasse