Условное выполнение реактивного программирования на Python

#python #reactive-programming #rx-py

#python #реактивное программирование #rx-py

Вопрос:

Я начал изучать реактивное программирование на Python с помощью RxPy модуля. Теперь у меня есть случай, когда я хотел бы запускать разные функции в зависимости от полученных элементов. Я достиг этого с помощью очень простого подхода

 from rx.subject import Subject
from rx import operators as ops

def do_one():
    print('exec one')

def do_two():
    print('exec two')

subject = Subject()
subject.pipe(
    ops.filter(lambda action: action == 'one')
).subscribe(lambda x: do_one())

subject.pipe(
    ops.filter(lambda action: action == 'two')
).subscribe(lambda x: do_two())


subject.on_next('one')
subject.on_next('two')
 

Мне это кажется немного уродливым, однако я не смог найти какой-либо случай, переключатель или другой метод в operations / Observables для запуска различных исполнений в зависимости от полученного элемента.

Есть ли лучший способ сделать это?

Ответ №1:

Это решение может быть хакерским, но вы можете использовать его несколькими различными способами:

 from rx.subject import Subject
from rx import operators as ops

def do_one():
    print('exec one')

def do_two():
    print('exec two')

subject = Subject()
subject.subscribe(lambda x: globals()[x]())

subject.on_next('do_one')
subject.on_next('do_two')
 

производит

 exec one
exec two
 

я также использовал нечто подобное, когда класс был неизвестен во время вызова… вот так:

 import Workers  # a module in my app with different workers

Wrkr = getattr(Workers, wrkr_type)  # in your case, x == wrkr_type
w = Wrkr(...)
 

поэтому, когда вам придет время переместить некоторые из этих функций в разные файлы или даже модули, вы все равно сможете добиться того же решения… вообще говоря, конечно, вы не хотите использовать globals() 😉