Как работать с фильтром для нескольких функций? - PullRequest
1 голос
/ 06 марта 2020

У меня есть следующий сценарий, в котором большинству моих функций требуется возвращать разные вещи в зависимости от условия.

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"

is_cond_met будет общим для всех функций, которые я вызываю. Я только что положил два здесь, однако у меня больше 15.

Примечание: Фактическая функция содержит сложные логики c, а не просто возвращает несколько жестко закодированных строк.

def get_root_path(is_cond_met=False):
    if is_cond_met:
        ## 
        ## Logic 
        ## 
        return "something"
    else
        #
        # Logic 
        #
        return "something else"

Приведенный выше код работает, однако не выглядит оптимальным, или pythoni c. Есть ли лучшее решение для этого?

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Вы можете эффективно объединить функции фильтра вместе, используя несколько обобщенных c функций, таких как:

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']
0 голосов
/ 06 марта 2020

Вы можете написать функцию, которая возвращает такие функции:

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")
...