Параметр изменения от лямбды функционирует к лямбда-выражению

Я не собираюсь писать для вас все целиком, включая анализ двоичного содержимого файла GIF, но вот пример пошаговой загрузки файла с использованием популярного стороннего модуля запросов . ] (используя информацию в этом разделе своей документации). Надеюсь, это даст вам хорошую отправную точку.

import requests

img_url = 'https://upload.wikimedia.org/wikipedia/commons/d/d3/Newtons_cradle_animation_book_2.gif'
#img_filename = 'test.gif'

response = requests.get(img_url, stream=True)
if response.status_code != 200:
    print('Error:', response.status_code)
else:
    header = response.raw.read(6)
    print(header)  # b'GIF89a'

#    # Download whole file in chunks and save locally.
#    with open(img_filename, 'wb') as f:
#        for chunk in response.iter_content(chunk_size=128):
#            f.write(chunk)

print('done')

7
задан Michael Myers 24 March 2009 в 15:05
поделиться

3 ответа

Вскрыть противоречия field и создайте новое выражение, что-то вроде этого:

var expr = Expression.Lambda<Func<TResult, bool>> (
    Expression.Call (field.Body, typeof (string).GetMethod ("Contains"),
        Expression.Constant (value)), field.Parameters) ;

(отредактированный согласно улучшению Maxs в комментариях)

6
ответ дан 6 December 2019 в 23:13
поделиться

Необходимо будет использовать Expression.Invoke; что-то как (непротестированный):

public static IQueryable<TResult> WithFieldLike<TResult>(
   this IQueryable<TResult> query,
   Expression<Func<TResult, string>> field,
   string value)
{
    var param = Expression.Parameter(typeof(TResult), "x");
    var expr = Expression.Lambda<Func<TResult, bool>>(
        Expression.Call(Expression.Invoke(field, param),
            "Contains", null, Expression.Constant(value)), param);

    return query.Where(expr);
}

(редактирование: зафиксированный)

4
ответ дан 6 December 2019 в 23:13
поделиться

Используйте Компиляцию для возвращения лямбды:

Expression<Func<TResult, bool>> expr = 
   trans => field.Compile()(trans).Contains(value);

Править: Возгласы - мой воздушный компилятор привел меня к сбою. После компиляции Вы получаете делегата. Но, все еще необходимо звонить, это, чтобы заставить строку звонить Содержит.

1
ответ дан 6 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: