を誤ってイテラブルとして使用するバグがあり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...
これはバグですか、それとも機能ですか? Observable
s は反復可能であることを意図していますか?