如何处理多种功能的过滤器?

时间:2020-03-06 15:11:06

标签: python python-3.x python-2.7

在以下情况下,大多数函数需要根据条件返回不同的内容。

<script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.3/dist/Chart.min.js"></script>
<canvas id="canvas"></canvas>

def get_root_path(is_cond_met=False): if is_cond_met: return "something" else return "something else" def get_filename(is_cond_met=False): if is_cond_met: return "file name A" else return "file name B" 对于我正在调用的所有功能将是通用的。我刚刚在这里放了两个,但是我已经超过15个了。

注意:实际函数包含复杂的逻辑,而不仅仅是返回几个硬编码的字符串。

is_cond_met

上面的代码有效,但是似乎不是最佳的或pythonic。有更好的解决方案吗?

2 个答案:

答案 0 :(得分:0)

您可以编写一个返回此类函数的函数:

def conditional(a, b, default=False):
    def cond(value=default):
        return a if value else b
    return cond

get_root_path = conditional("something", "something else")
get_filename = conditional("file name A", "file name B")

答案 1 :(得分:0)

您可以使用以下几个通用函数将过滤器函数有效地链接在一起:

from functools import partial


def check(condition, values):
    return values[int(condition)]

def chain(condition, values):
    return list(map(partial(check, condition), values))


root_paths = "something", "something else"
filenames = "file name A", "file name B"

values = [root_paths, filenames]

is_cond_met = False
result = chain(is_cond_met, values)
print(result)  # -> ['something', 'file name A']

is_cond_met = True
result = chain(is_cond_met, values)
print(result)  # -> ['something else', 'file name B']