Может кто-нибудь объяснить мне это действительно странное наблюдение?
Я пытался вызывать методы расширения Rx изнутри IronPython, и это оказалось просто невозможным. Я свел это к этому простому примеру:
import clr
clr.AddReference("System.Core")
from System.Linq import Enumerable
def process(value):
return Enumerable.Select(value, lambda x:x)
В этом случае мы начинаем с обычного LINQ. Если я вызываю функцию process
из своей среды хостинга с массивом или любым другим объектом IEnumerable
, она работает совершенно нормально.
Затем я попытался просто заменить ссылки, чтобы использовать методы расширения Observable
, например:
import clr
clr.AddReference("System.Reactive.Linq")
from System.Reactive.Linq import Observable
def process(value):
return Observable.Select(value, lambda x:x)
В этом случае, если я вызову функцию process
с объектом IObservable
, вызов завершится с уродливым сообщением об ошибке:
expected IObservable[object], got Select[int, int]
Кто-нибудь наткнулся на что-то подобное? Я что-то пропустил? Есть ли какой-то особый случай, чтобы заставить Enumerable
работать с лямбда-делегатами, которых нет Observable
? Должен признаться, я здесь совершенно сбит с толку.
Кстати, в качестве проверки работоспособности отлично работает следующий пример:
import clr
clr.AddReference("System.Reactive.Linq")
from System.Reactive.Linq import Observable
def process(value):
return Observable.Sum(value)
Я хотел оставить это там, просто чтобы было ясно, что проблема действительно в вызове метода Observable.Select
.