#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()
😉