Python switcha improwizuję w trochę inny sposób - w moim przekonaniu sensownieszy, zmuszający do podziału na funkcje.
Są dwie wersje, z lambdą do przekazywania argumentów i bez niej, do wywołania.
def foo1():
print(1)
def foo2():
print(2)
def main():
switch = { 1: foo1,
2: foo2}
select = int(input("Select: "))
switch.get(select)() #W drugim nawiasie dajesz argumenty jeśli są identyczne dla każdej funkcji.
main()
A tu drugi przykład argumentowych funkcji:
def foo1(a, b, c):
print(1, a, b, c)
def foo2(b, c):
print(2, b, c)
c+=1
def main():
a=2
b=3
c=4
switch = { 1: lambda a1=a, b1=b, c1=c: foo1(a1,b1,c1),
2: lambda b1=b: foo2(b1, c)}
select = int(input("Select: "))
c+=1
switch.get(select)() #Tu wywołujesz całego "switch'a"
switch.get(select)() #Tu wywołujesz całego "switch'a"
#Argumenty jakie wykorzystuje funkcja, definiuje to jak użyjesz lambdy,
#czy dasz argument po prostu, czy nadasz mu stałą wartość do lambdy, co widać w przykładzie foo1 i foo2.
#Dla foo1 jest już przypisane 4 w momencie tworzenia switch'a.
#Dla foo2 jest wykorzystywana zmienna c, niezależnie od tego jak się zmieni w trakcie programu.
#Wszystkie wartości są tylko pobierane do funkcji bez możliwości ich zmiany.
#Istnieje jeszcze jeden sposób jeśli chcemy modyfikować te zmienne, ale niestety aktualnie nie przypominam sobie tego z wyjątkiem słowników. Bo w klasach to najprościej wykorzystywać pierwszą wersję i parametr self.
main()