我正在建立一个简短的答案测验(作为字符串输入)。虽然我已经设法启动并运行测验,但我发现我编写的代码似乎有点丑陋/笨拙而且b)在不同情况下不可扩展/可重用。
这是一个例子(这种模式在不同的功能中使用了很多次):
answers_to_store = Answer(answer_1=user_answer_list[0],
answer_2=user_answer_list[1],
answer_3=user_answer_list[2],
answer_4=user_answer_list[3],
answer_5=user_answer_list[4])
有没有更好的方法来创建这些参数?我看不到用变量或类似方法替换参数名称(即answer_1)的方法(这是我能想到使任务更容易的唯一方法)。
我发现的唯一方法是使用循环创建参数作为文本,然后通过exec运行生成的命令 - 这是实现这一目标的唯一方法,还是有更好的方法?另一个限制是,这意味着具有存储功能来存储测验中的5个答案将与存储20个答案的答案不同(数据库具有那么多列)。
我已经尝试过搜索,但问题是我不知道这个的正确术语,我最接近的事情是通过循环和exec创建适当的命令 - 这会起作用,但是这似乎是一种冗长的方式。
答案 0 :(得分:0)
假设这是一个简短的答案测验,创建一个questionID数据库,answer_string然后使用questionID访问该表,并将输出与用户输入进行比较。这是一个想法:
from sqlalchemy import create_engine, Table, MetaData, Column, Integer, VARCHAR
from sqlalchemy.orm import mapper, sessionmaker
Session = sessionmaker()
engine = create_engine('sqlite:///foo.db')
Session.configure(bind=engine)
sess = Session()
metadata = MetaData()
question = Table('question', metadata,
Column('id', Integer, primary_key=True),
Column('answerKey', VARCHAR(None))
)
class Question(object):
def __init__(self, answer):
self.answer = answer
mapper(Question, question)
def check(INquestionID, answerInput):
# Return an answer string associated with the question.
ans = sess.query(question.answer).filter(question.id == INquestionID).limit(1)
if answerInput == ans[0]:
return True
else:
return False
此方法存储一个字符串(SQL Server中最多8000个字符),根据ID访问并比较评分。