I had a bug which accidentally used an Observable
as an iterable. For most objects, this is usually easily detected:
>>> 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
However, for an Rx observable, it silently crashes Python:
MWE:
from rx import Observable
observable = Observable.from_list([1,2,3])
tuple(observable) # Python will die silently here
There is no traceback and no indication there is any problem. This makes already-hard-to-debug concurrent reactive code even harder to debug -- took me 2 hours to finally track this one down.
On closer inspection, iterating over an Observable
appears to create new observables, although from where I have no idea given the observable has no __iter__
method.
>>> 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...
Is this a bug, or a feature? Are Observable
s intended to be iterable?