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
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

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]()
  • Odpowiedz
@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 :)
  • Odpowiedz