如何从Rx Observable中提取值?

时间:2016-05-05 22:17:37

标签: python reactivex rx-py

我正在尝试将一些ReactiveX概念集成到现有项目中,认为这可能是一种很好的做法,也是一种使某些任务变得更清洁的方法。

我打开一个文件,从它的行创建一个Observable,然后做一些过滤,直到我得到我想要的行。现在,我想使用re.search()从其中两行中提取一些信息以返回特定的组。我不能为我的生活弄清楚如何从Observable中获取这些值(不将它们分配给全局变量)。

train = 'ChooChoo'

with open(some_file) as fd:
    line_stream = Observable.from_(fd.readlines())

a_stream = line_stream.skip_while(
        # Begin at dictionary
        lambda x: 'config = {' not in x
    ).skip_while(
        # Begin at train key
        lambda x: "'" + train.lower() + "'" not in x
    ).take_while(
        # End at closing brace of dict value
        lambda x: '}' not in x
    ).filter(
        # Filter sdk and clang lines only
        lambda x: "'sdk'" in x or "'clang'" in x
    ).subscribe(lambda x: match_some_regex(x))

在该流的末尾代替.subscribe(),我尝试使用.to_list()获取一个列表,我可以在其中迭代“正常方式”,但它只返回一个类型的值:

<class 'rx.anonymousobservable.AnonymousObservable'>

我在这里做错了什么?

我见过的每个Rx例子除了打印结果外什么也没做。如果我想在数据结构中使用它可以同步使用该怎么办?

1 个答案:

答案 0 :(得分:0)

从短期来看,我使用itertools实现了我想要的功能(由@jonrsharpe建议)。我的脑子里仍然存在问题,所以今天我回到它身上并想出来了。

这不是Rx的一个很好的例子,因为它只使用一个线程,但至少现在我知道如何突破&#34; monad&#34;需要的时候。

#!/usr/bin/env python

from __future__ import print_function
from rx import *

def my_on_next(item):
    print(item, end="", flush=True)

def my_on_error(throwable):
    print(throwable)

def my_on_completed():
    print('Done')
    pass

def main():
    foo = []

    # Create an observable from a list of numbers
    a = Observable.from_([14, 9, 5, 2, 10, 13, 4])

    # Keep only the even numbers
    b = a.filter(lambda x: x % 2 == 0)

    # For every item, call a function that appends the item to a local list
    c = b.map(lambda x: foo.append(x))
    c.subscribe(lambda x: x, my_on_error, my_on_completed)

    # Use the list outside the monad!
    print(foo)

if __name__ == "__main__":
    main()

这个例子是相当人为的,并且所有中间可观察量都不是必需的,但它表明你可以轻松地完成我最初描述的内容。