python - корпус переключателя для функций - PullRequest
0 голосов
/ 20 апреля 2020

только что начал связываться с python, и я ищу альтернативу для Switch-Case, как у меня в C#

У меня есть меню с 3 вариантами, например. это переключатель, который у меня есть сейчас:

def mySC(i):
    switcher = {
        '1': funcName1,
        '2': funcName2,
        '3': funcName3
    }
    func = switcher.get(i, lambda: 'Invalid')
    return func()

, он работает, и я могу ввести нужную мне функцию. Моя проблема в том, что если я хочу отправить разные аргументы для каждой функции? например если кто-то ввел 1, я хочу, чтобы он ввел funcName1(), но также отправил в него переменную типа funcName1(nums), а для 2 я хочу отправить funcName1(myTwoDimList)

как я смогу это сделать что?

спасибо заранее, Амит.

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Вы также можете добавить *args (позиционный) и **kwargs (ключевое слово) аргументы в вашу функцию:

def mySC(i, *args, **kwargs):
    switcher = {
        '1': funcName1,
        '2': funcName2,
        '3': funcName3
    }
    func = switcher.get(i, lambda *args, **kwargs: 'Invalid')
    return func(*args, **kwargs)
0 голосов
/ 20 апреля 2020

Если переменные, которые вы хотите передать своим функциям, уже определены в этот момент, вы можете просто использовать частичное приложение . У Python есть объект partial в его stdlib, но здесь достаточно просто lambda:

foo = 42
bar = ["s", "p", "a", "m"]
baaz = {"parrot": "dead"}  

def mySC(i):
    switcher = {
        '1': lambda: func1(foo),
        '2': lambda: func2(bar),
        '3': lambda: func3(baaz)
    }
    func = switcher.get(i, lambda: 'Invalid')
    return func()

Если эти переменные не определены, когда вы определяете свою функцию myMC, но все еще «исправлено» от одного вызова к другому (в том же процессе), вы можете добавить слой косвенности для динамического создания функции MyS C:

def create_switch(foo, bar, baaz):
    def mySC(i):
        switcher = {
            '1': lambda: func1(foo),
            '2': lambda: func2(bar),
            '3': lambda: func3(baaz)
        }
        func = switcher.get(i, lambda: 'Invalid')
        return func()

    return mySC


foo = 42
bar = ["s", "p", "a", "m"]
baaz = {"parrot": "dead"}  

mySC = create_switch(foo, bar, baaz)
mySC(1)
...