Wpis z mikrobloga

#python i #programowanie
chciałbym uprościć rozbudowaną konstrukcję if elif (...) elif else - w obecnym rozwiązaniu w zależności od kombinacji warunków sprawdzanych na dwóch zmiennych wykonywana jest inna funkcja
chciałbym więc utworzyć słownik - lookup dla tych zmiennych i funcji, coś w tym stylu function_lookup (wykop niestety zjada spacje): https://pastebin.com/mm1h6NPD

import inspect
def funkcja_a_1():
print(f'hello world z funkcji {inspect.currentframe().f_code.co_name}')
def funkcja_a_2():
print(f'hello world z funkcji {inspect.currentframe().f_code.co_name}')
function_lookup = {
('a', 1) : funkcja_a_1,
('a', 2) : funkcja_a_2
}
configs = [
('a', 1),
('a', 2),
('b', 1),
]
for config in configs:
print(config)
function_lookup.get(config, lambda: print('no action specified'))()
ale to nie pozwoli mi zmapować np. takiego kryterium: *pierwsza zmienna wynosi 'a', a druga nie równa się ani 1 ani 2* - potrzebuję informacji, jak efektywnie podejść do tego tematu - czy ktoś byłby w stanie mnie pokierować?
docelowo te kryteria mają być generowane dynamicznie z jakiegoś pliku albo bazy
  • 8
functionlookup = {

('a', 1) : funkcjaa1,

('a', 2) : funkcjaa2

}


@janek_: zamiast ('a', 1) lub ('a', 2) możesz użyć funkcję, np.:

functionlookup = {

(p1, p2) => p1 == 'a' && p2 != 1 && p2 != 2 : funkcjaa1,

(p1, p2) => p1 == 'a' && p2 == 2 : funkcjaa2

}
No jeśli się uprzeć to można, jeśli koniecznie chcesz w ten sposób:

def x(key):
.. func_ptr = { ('a', 1): funa1, ('a', 2): funa2, ('b', 1): funb1 }
.. try:
.... func_ptr[key]()
.. except KeyError:
.... print("no action")

albo jeśli faktycznie już taki hardcore że musisz nazwę funkcji z tego składać to rzeczywiście eval, ale zastanowiłbym się nad zmianą takiej architektury.

def x(a, b):
.. try:
.... eval(f"funkcja{a}_{b}")()
.. except:
.... print("no
@m_bielawski: super, dzięki!

nawet przeszło mi przez głowę wcześniej, żeby może pomyśleć o "structural pattern matching" w kontekście mojego problemu (czyli jestem na etapie, że mam dobrą intuicję), ale zerknąłem na PEP622 i się trochę przestraszyłem...

tym bardziej dzięki, bo teraz przy okazji, z twojego kodu zrozumiałem jak działa structural pattern matching :)