J'essaie d'apprendre à compiler automatiquement tous les membres d'une classe dans une liste. Ce segment de code ne fait pas partie d'un vrai projet, mais juste un exemple pour m'aider à expliquer mon objectif. Je n'arrive pas à trouver de matériel de lecture à ce sujet, et je ne sais même pas si c'est possible ou non. Merci d'avance pour vos réponses! =)
class question:
def __init__(self,question,answer,list_of_answers):
self.question=question
self.answer=answer
self.list_of_answers=list_of_answers
question_01=question('''
Which of these fruits is red?
A). Banana
B). Orange
C). Apple
D). Peach
''',"C",("A","B","C","D"))
question_02=question('''
Which of these is both a fruit and a vegetable?
A). Cauliflower
B). Tomato
C). Brocolli
D). Okrah
''',"B",("A","B","C","D"))
'''My objective is to write code that can automatically compile my questions (the
members of my question class) into a list,even if I have hundreds of them, without
having to manually write them into a list.'''
#If there are only two questions, final output should automatically become:
all_questions=[question_01,question_02]
#If there are one hundred questions, final output should automatically become:
all_questions=[question_01,question_02, ... ,question_99,question_100]
#Without having to manually type all of the one hundred questions (or members
#of the question class) to the list.
3 Réponses :
Vous ne devriez pas avoir 100 variables question_01 à question_100 en premier lieu. Vous allez passer un mauvais moment lorsque vous souhaitez réorganiser les questions, en supprimer une ou en ajouter une au milieu. Voulez-vous vraiment avoir à renommer 98 variables lorsque vous voulez mettre une nouvelle question entre question_02 et question_03 ?
À ce stade, vous devriez fortement envisager de mettre votre questions dans un fichier de données séparé de votre code source et lire les questions à partir du fichier. Même si vous ne le faites pas, vous devez éliminer les variables numérotées. Mettez les questions dans la liste pour commencer. (De plus, les classes doivent être nommées dans CamelCase):
questions = [
Question('''
Which of these fruits is red?
A). Banana
B). Orange
C). Apple
D). Peach
''', "C", ("A","B","C","D")),
Question('''
Which of these is both a fruit and a vegetable?
A). Cauliflower
B). Tomato
C). Brocolli
D). Okrah
''', "B", ("A","B","C","D")),
...
]
Bonne information! Je ne connais pas très bien la création et la lecture de fichiers texte, mais je pense que je vais relever le défi et apprendre comment. Merci pour le conseil! Au fait, j'attendrai un peu, puis je voterai votre réponse comme la meilleure si personne ne peut la surpasser! =)
Il existe un moyen de faire ce que vous vouliez: obtenir une liste de tous les objets d'un type donné à partir d'un module (ou fichier). Je présente deux solutions:
Disons que vous avez le fichier suivant:
QuestionModule.py
class question:
def __init__(self,question,answer,list_of_answers):
self.question=question
self.answer=answer
self.list_of_answers=list_of_answers
question_01=question('''
Which of these fruits is red?
A). Banana
B). Orange
C). Apple
D). Peach
''',"C",("A","B","C","D"))
question_02=question('''
Which of these is both a fruit and a vegetable?
A). Cauliflower
B). Tomato
C). Brocolli
D). Okrah
''',"B",("A","B","C","D"))
def getQuestions():
import sys
l = dir(sys.modules[__name__])
r = []
for e in l:
if sys.modules[__name__].question==type(getattr(sys.modules[__name__],e)):
r.append(getattr(sys.modules[__name__], e))
return r
L = getQuestions()
for i in L :
print(i)
print(i.question)
Ensuite, vous pouvez obtenir toutes les questions par:
GetQuestions.py
import GetQuestions l_questions = GetQuestions.get()
Ou:
import QuestionModule
def get():
r = []
for attribute in dir(QuestionModule):
#print(attribute," ",type(getattr(QuestionModule,attribute)))
if type(getattr(QuestionModule,attribute)) == QuestionModule.question:
r.append(getattr(QuestionModule,attribute))
return r
l_questions = get()
Si vous voulez faire la même chose à partir du même fichier, vous pouvez faire:
class question:
def __init__(self,question,answer,list_of_answers):
self.question=question
self.answer=answer
self.list_of_answers=list_of_answers
question_01=question('''
Which of these fruits is red?
A). Banana
B). Orange
C). Apple
D). Peach
''',"C",("A","B","C","D"))
question_02=question('''
Which of these is both a fruit and a vegetable?
A). Cauliflower
B). Tomato
C). Brocolli
D). Okrah
''',"B",("A","B","C","D"))
Vous pouvez retirer le import sys de la méthode et le placer en haut si vous devez appeler getQuestions plusieurs fois.
Wow! Votre code est plus avancé que ma compréhension actuelle de Python, mais après l'avoir bricolé, je peux dire que vous avez trouvé la solution. Maintenant, je dois juste comprendre comment cela fonctionne LOL. Merci mon pote!
Les deux réponses étaient très bonnes. Je souhaite que je pourrais choisir les deux comme réponse principale. Je l'ai donné à mm_ parce que sa réponse correspond le mieux à mes objectifs, mais j'aime beaucoup la réponse de user2357112 aussi.
Merci pour les réponses à tous!
Si vous m'envoyez une adresse e-mail, je peux vous dire comment cela fonctionne. Si vous êtes toujours intéressé.
Pourquoi ne créez-vous pas simplement une liste et n'ajoutez pas les objets?
Je ne pense pas que "compiler" soit le mot juste.
Puis-je supposer que votre entrée est une liste de questions comme: [q1, q2, ... q100] où q1 = "Lequel de ces fruits est rouge?", Q2 = "Lequel de ces fruits est à la fois un fruit et un légume?" , etc; et [a1, a2, ... an] où a1 = ["Banane", "Orange", "Apple", "Peach"], ... etc. Vous ne savez pas quelle est votre entrée et quelle sortie vous recherchez .
@ juanpa.arrivillaga Bon travail! Ce sera parfait pour moi!
@mm_ En fait, ce que je cherchais était une liste comme sortie. En gros, je veux dire au programme "Prenez chaque objet qui fait partie de cette classe spécifique, et faites-en une liste. Je pourrais ajouter chaque objet séparément comme juanpa.arrivillaga le recommande, et cela fonctionnera très bien, mais je suis espérant également créer une liste de tous les objets pour cette classe avec une seule commande. =)
@ brenton-swafford, veuillez vérifier la solution que j'ai publiée ci-dessous. Je pense que c'est ce que tu voulais faire.
@mm_ Merci mon pote! Je vais l'essayer, puis proposer une meilleure réponse. =)