如果我有一个应该有条件行为的函数,那么最好的方法是什么?

时间:2018-04-13 06:20:53

标签: python oop design-patterns data-structures

假设我有一个神经网络。我可以在其中执行一些操作,如下所示:

def one_iteration(my_op, data, ...):
    for i in range(...):
        ...
        my_op(data)
        ...

想象一下,for循环不仅仅是一个for循环,而且它是如何迭代一组对象的。现在,如果传递my_op training函数,我就设置了。但是,如果我想将evaluate函数作为my_op传递,现在我想让我的中间结果知道我是如何做的。所以我会这样做:

def one_iteration(my_op, data, ...):
    results = []
    for i in range(...):
        ...
        result = my_op(data)
        results.append(result)
    return results

我会有一个列表/数组,其结果让我评估该网络在该迭代中的执行情况。现在,假设我希望my_opvalidate,为此,我需要更多中间信息。我也许可以这样做:

def one_iteration(my_op, data, is_validation, ...):
    results = []
    if is_validation:
        more_results = []
    for i in range(...):
        ...
        result, other_result = my_op(data)
        results.append(result)
        if is_validation:
            more_results.append(other_result)
    return results

但是,此时它开始变得各种各样的混乱。我知道我可以实现单独的trainevaluatevalidate方法,并且在每个方法中,我可以做所需要的,但我看到的问题是每个方法将重复它在对象上迭代的方式(在这种情况下,for循环),因此,如果我改变迭代的方式,我必须在3个不同的地方更改它。我是否缺少一种设计模式?

1 个答案:

答案 0 :(得分:0)

所以传递两个方法:一个是元操作,它接受操作:

'response' => [
            'formatters' => [
                \yii\web\Response::FORMAT_JSON => [
                    'class' => 'yii\web\JsonResponseFormatter',
                    'prettyPrint' => YII_DEBUG, // use "pretty" output in debug mode
                    'encodeOptions' => JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE,
                ],
            ],
        ],
'urlManager' => [
            'enablePrettyUrl' => false,
            'showScriptName' => false,
            'rules' => [
                [
                    'class' => 'yii\rest\UrlRule',
                    'controller' => 'v1/blog',
                    'pluralize'=>false
                ]
            ],
        ]

def one_iteration(meta_op, my_op, data, ...): for i in range(...): ... meta_op(my_op, data) ... 决定如何处理结果。