1

を誤ってイテラブルとして使用するバグがありObservableました。ほとんどのオブジェクトでは、これは通常簡単に検出されます。

>>> tuple(object())

Traceback (most recent call last):
  File "C:\Program Files (x86)\Python27\lib\site-packages\IPython\core\interactiveshell.py", line 3035, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-4-40e3dfc60da8>", line 1, in <module>
    tuple(object())
TypeError: 'object' object is not iterable

ただし、Rx オブザーバブルの場合、Python は黙ってクラッシュします。


MWE:

from rx import Observable

observable = Observable.from_list([1,2,3])
tuple(observable)  # Python will die silently here

トレースバックはなく、問題があるという兆候もありません。これにより、すでにデバッグが困難な同時リアクティブ コードのデバッグがさらに困難になります。最終的にこれを追跡するのに 2 時間かかりました。


Observableよく調べてみると、オブザーバブルにメソッドがないことを考えるとどこからかわからないものの、を繰り返し処理すると新しいオブザーバブルが作成されるように見えます__iter__

>>> for i, x in enumerate(observable):
>>>     print x
>>>     if i > 100:  # To prevent Python from crashing
>>>         break

<rx.anonymousobservable.AnonymousObservable object at 0x03111710>
<rx.anonymousobservable.AnonymousObservable object at 0x03111850>
<rx.anonymousobservable.AnonymousObservable object at 0x03111990>
<rx.anonymousobservable.AnonymousObservable object at 0x03111AD0>
<rx.anonymousobservable.AnonymousObservable object at 0x03111C10>
<rx.anonymousobservable.AnonymousObservable object at 0x03111D50>
<rx.anonymousobservable.AnonymousObservable object at 0x03111E90>
etc...

これはバグですか、それとも機能ですか? Observables は反復可能であることを意図していますか?

4

2 に答える 2