在许多结构相似的函数中泛化结构相似的return语句的方法

时间:2018-09-11 15:42:53

标签: python

我有一个小小的数学实践应用程序,在其中添加了新的问题,我只是定义了一个新函数,该函数返回一些像这样的字典:

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语句之外。

2 个答案:

答案 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)()