Я не собираюсь писать для вас все целиком, включая анализ двоичного содержимого файла 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')
Вскрыть противоречия field
и создайте новое выражение, что-то вроде этого:
var expr = Expression.Lambda<Func<TResult, bool>> (
Expression.Call (field.Body, typeof (string).GetMethod ("Contains"),
Expression.Constant (value)), field.Parameters) ;
(отредактированный согласно улучшению Maxs в комментариях)
Необходимо будет использовать 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);
}
(редактирование: зафиксированный)
Используйте Компиляцию для возвращения лямбды:
Expression<Func<TResult, bool>> expr =
trans => field.Compile()(trans).Contains(value);
Править: Возгласы - мой воздушный компилятор привел меня к сбою. После компиляции Вы получаете делегата. Но, все еще необходимо звонить, это, чтобы заставить строку звонить Содержит.