Замените несколько условий на СУХОЙ раствор - PullRequest
0 голосов
/ 14 сентября 2018

у меня есть A: логическое значение; B: логическое значение;

A=0, B=0: run func1 and func2
A=0, B=1: run func1 and func3
A=1, B=0: run func2
A=1, B=1: run func3

Каждая функция имеет разные подписи с разным количеством аргументов.
Прямо сейчас я сделал что-то вроде этого:

if not A and not B: run func1 and func2
if not A and B: run func1 and func2
if A and not B: run func1 and func2
if A and B: run func1 and func2

но вместо вызова функций я повторяю один и тот же блок кода для каждого оператора if, я знаю, что он избыточен, как я могу заменить этот массивный блок операторов if на несколько строк кода, вызывающих нужный метод только один раз, когда это необходимо?

Я думал, что смогу использовать словарь отображения, подобный этому:

mapping_dict = {
    True: {
        True: [func3],
        False: [func2]
    },
    False: {
        True: [func1, func3],
        False: [func1, func2]
    }

но даже в этом случае мне нужно решение, чтобы определить, какие аргументы для передачи функции, в зависимости от функции, возвращаемой

mapping_dict[A][B]

Мой может быть конкретным случаем, но я хотел бы знать, как решить этот тип проблем с " D on't R epeat Y Мы сами "решение, есть ли образец для этой проблемы? как это работает? Это язык независимый?

Спасибо за ваше терпение

1 Ответ

0 голосов
/ 14 сентября 2018

Вы слишком усложняете свое условие:

func1() зависит только от a.

func2() и func3() на b.

Итак, вам нужно два независимых условия:

if not a:
    func1()

if b:
    func3()
else:
    func2()

Это эквивалентно, потому что func2() & func3() правдивость не зависит от a ... это легче увидеть, если вы переставите свои утверждения истинности, сгруппировав эти функции:

A=0, B=0: run func1 and func2
A=1, B=0: run func2

A=0, B=1: run func1 and func3
A=1, B=1: run func3

, если b равен нулю, func2() выполняется. если b равно 1, func3() запускается. В обоих случаях a может быть 1 или 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...