我有一个小小的数学实践应用程序,在其中添加了新的问题,我只是定义了一个新函数,该函数返回一些像这样的字典:
def p4():
vertices = random.randrange(1, 8)
num_trees = random.randrange(2, 4)
format_dict = {
'vertices': vertices,
'num_trees': num_trees
}
answer_dict = {
'answer': vertices*num_trees,
'wrong_1': 0,
'wrong_2': 1,
'wrong_3': 'There do not exist any'
}
return {'question': format_dict, 'answers': answer_dict}
就某些情况而言,这是Django应用。其中每个问题的文本都存储在模型中,并且当用户在网页上查看问题时,模型的文本根据format_dict
进行格式化,并且根据{ {1}}。
每个 问题的行answer_dict
。有没有办法我可以通过这两个字典调用这样的函数,并且在省略返回值的同时具有相同的功能?我觉得,如果每个功能都需要有这行,那我可以做一些概括(...装饰器,也许吧?我从没用过,但是现在可能是一个很好的借口)。>
处理字典的模型方法如下:
return {'question': format_dict, 'answer': answer_dict}
我唯一想到的是将def gen_QAPair(self):
# The name/location of the problem's function is stored in 'module'
module = importlib.import_module(self.QAModule)
# This calls the function (p4, for example) and gets the dictionaries
qaPair = getattr(module, self.QAFunction)()
# This takes the unformatted text and formats it according to
# the returned format dictionary
formatted_text = self.unformatted_text.format(**qaPair['question'])
return {'question': formatted_text, 'answers': qaPair['answers']}
和answer_dict
组合成字典,然后返回该字典,但实际上并不会节省很多代码,只是定义了键在return语句之外。
答案 0 :(得分:1)
我看到两个选择。
首先,您要概括一下所有问题函数都以cartPreview
的形式返回。您可以将其表示为namedtuple
,或者如果您使用的是Python 3.7,则可以表示为data class。
命名元组示例:
class Player
{private:
int currentattack;
int maximumattack;
int buffedattack;
int maximumhealth;
int currenthealth;
int buffedhealth;
....
}
这在某种程度上解决了结构泛化的问题,但是您仍然有回报。
一种更通用,更困难的方法是将每个问题存储在配置文件中。当然,您必须编写一些小语言和解析器才能获得所需的动态数据,但是我想如果您扩展到成千上万个问题,那是值得的。
答案 1 :(得分:0)
这是一种使它不那么冗长的方法:
def p4():
vertices = random.randrange(1, 8)
num_trees = random.randrange(2, 4)
return dict(
question = {
'vertices': vertices,
'num_trees': num_trees
},
answer = {
'answer': vertices*num_trees,
'wrong_1': 0,
'wrong_2': 1,
'wrong_3': 'There do not exist any'
}
)
(我注意到您在示例中的“答案”和“答案”之间存在差异。)
另一种选择是返回一个元组,并在gen_QAPair()函数中解压缩该元组:
return ({
'vertices': vertices,
'num_trees': num_trees
},
{
'answer': vertices*num_trees,
'wrong_1': 0,
'wrong_2': 1,
'wrong_3': 'There do not exist any'
})
...然后...
question, answer = getattr(module, self.QAFunction)()