Замена нескольких elif для словаря для нескольких функций - PullRequest
0 голосов
/ 07 октября 2018

Я читал о C-подобной switch идиоме в python, которая выражается в виде словаря, в большинстве примеров используется одна функция и оператор break.В моем случае у меня есть следующие if

if method == 'c3':
    Deh = buildD4(I)
    Dhe = buildD343(I-1)
elif method == 'c4':
    Deh = buildD4(I);
    Dhe = buildD4(I-1)
elif method == 'c5':
    Deh = buildD343(I)
    Dhe = buildD343(I-1)
elif method == 'e2':
    Deh = buildAE4(I)
    Dhe = buildAH4(I)
elif method == 'y2':
    Deh = buildD2(I)
    Dhe = buildD2(I-1)
    dt=dx

И я переписал как:

eh = {
        'c3': buildD4(I),
        'c4': buildD4(I),
        'c5': buildD343(I),
        'e2': buildAE4(I),
        'y2': buildD2(I),
}
Deh = eh[method]

he = {
        'c3': buildD343(I-1),
        'c4': buildD4(I-1),
        'c5': buildD343(I-1),
        'e2': buildAH4(I),
        'y2': buildD2(I-1),
}
Dhe = he[method]

if method == y2:
    dt=dx

Мои вопросы:

  1. Функции внутрисловарь лениво оценивается, то есть они оцениваются только когда я присваиваю их Deh или Dhe?

1.1 Если нет.Как мне этого добиться?

Есть ли лучший (более компактный, читаемый и идиоматический) способ написать это?(или if/elif - лучшая конструкция?

PS: все эти build* функции возвращают квадратную матрицу с размером заданного параметра. I является целым числом, dt иdx - это числа с плавающей запятой, а method - строка.

1 Ответ

0 голосов
/ 07 октября 2018
  1. Нет, сначала должен быть составлен словарь, что означает, что все ключи и значения должны быть оценены.Вы можете сохранять функции как значения, но:

    data = {'a': lambda x: print(f"hello, {x}!"), 'b': lambda x: print(f"Hi, {x}!")}
    data['a']("world")
    

    1.1 Вы можете сделать это: unevaluated = lambda: do_stuff().Теперь, do_stuff будет вызываться только при вызове unevaluated(), но это выглядит несколько уродливо.

  2. Использование словарей, содержащих отдельные функции, может быть способом пойти

...