Должны ли python 'переключатели' (dict) вызывать каждый функционал внутри? - PullRequest
1 голос
/ 04 апреля 2019

Я пытался что-то кодировать с использованием переключателя Python, смоделированного в dict, как предложено в: Замены для оператора switch в Python? [Второй ответ, Ник]

Когда я тестировал, по какой-то причине вызывались все функции внутри, пробовал простой код, чтобы увидеть, что не так, и проблема повторилась.См .:

def switch(f):
    print('Switch got: ', f)
    var = {
        1: func1(),
        2: func2(),
        3: func3()
        }.get(f,False)
    return var

def func3():
    fb = 'Func3 called'
    print(fb)
    return fb

def func1():
    rsp = 'Func1 called'
    print(rsp)
    return rsp

def func2():
    rsp = 'Func2 called'
    print(rsp)
    return rsp

var = switch(1)
print(var)

Мое ожидаемое возвращение было просто:

Switch got:  1
Func1 called

Вместо этого я получил:

Switch got:  1
Func1 called
Func2 called
Func3 called
Func1 called

Что я получил от этого, так это то, что Python, кажется, работаеткаждый функционал внутри dict перед вызовом правильного ключа (1 в примере).

Это ожидаемое поведение в Python?

Есть ли способ обойти, где вызывается только функция, соответствующая клавише?

Ответы [ 2 ]

6 голосов
/ 04 апреля 2019

Это ожидаемое поведение в Python?

Да.

Есть ли способ, где вызывается только функция, соответствующая клавише?

На самом деле не вызывайте функции, когда вы создаете свою команду dict:

def switch(k):
    print('Switch got: ', k)
    func = {
        1: func1,
        2: func2,
        3: func3,
    }.get(k, bool)
    var = func()
    return var
1 голос
/ 04 апреля 2019

Инициализация этого словаря при вызове функции 'switch' также вызывает функции.Попробуйте что-то вроде этого,

def switch(f):
    print('Switch got: ', f)
    var = {
        1: func1,
        2: func2,
        3: func3
        }.get(f,False)
    if not var:
      return false
    return var()
...