【问题标题】:If I have a function that should have conditional behavior, what's the best way to do it?如果我有一个应该有条件行为的函数,那么最好的方法是什么?
【发布时间】:2018-04-13 06:20:53
【问题描述】:

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

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_op 成为validate,为此,我需要更多的中间信息。我也许可以这样做:

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 个不同的地方更改它。这里有我遗漏的设计模式吗?

【问题讨论】:

  • 看起来将功能分开会更干净。您提到您可能会更改迭代数据的方式。你在考虑嵌套循环吗?如果没有,那可以很容易地抽象出来。也许您可以进一步扩展您想要设计的潜在未来变化。虽然一般来说,现在做最少的必要工作并在您真正需要时进行重构也是很好的。

标签: python oop design-patterns data-structures


【解决方案1】:

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

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

并让meta_op 决定如何处理结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多