#python #web2py #reduce
#python #web2py #уменьшить
Вопрос:
Я смотрю на некоторый код Web2py.
Переменная tokens
представляет собой своего рода список строк. Чтобы быть более точным, это определяется как, tokens = form.vars.name.split()
где form.vars.name
— строка.
Мой вопрос касается следующей инструкции :
query = reduce(lambda a,b:aamp;b,[User.first_name.contains(k)|User.last_name.contains(k) for k in tokens])
Вот мои вопросы :
-
Я знаю, что
lambda a,b:aamp;b
определяет функциюa
иb
. Что такоеaamp;b
? -
Является ли
contains
методUser.first_name
специфичным для Web2py? Или это существует в стандартном Python? -
Что это за
|
оператор вUser.first_name.contains(k)|User.last_name.contains(k)
? -
Что делает
reduce
функция?
Комментарии:
1. У вас уже была возможность ознакомиться с документацией?
2. Если
contains(k)
возвращает логическое значение, его можно переписать какquery = all(User.first_name.contains(k) or User.last_name.contains(k) for k in tokens)
.3. Не обращайте внимания на мой предыдущий комментарий, поскольку
contains()
не возвращает логическое значение, а побитовые операторы были перезагружены для других целей. Подробнее смотрите ответ Йохена Ритцеля.
Ответ №1:
- В Web2Py
amp;
и|
не являются побитовыми и / или здесь, а используются для создания специального объекта, который представляет запрос к базе данных! Они соответствуютAND
иOR
в операторах SQL - содержит является частью Web2Pys DAL
- Смотрите 1.
- reduce — это fold, очень фундаментальная функция высшего порядка, которая по существу сводит список к результату, используя указанную функцию.
Комментарии:
1. Я не уверен, является ли это хорошим использованием перегрузки оператора. С одной стороны, это позволяет пользователям кратко указывать, что они хотят сделать. С другой стороны, неопытный читатель будет полностью сбит с толку, потому что перегрузка оператора в значение, настолько отличное от значения оператора, необычна (по крайней мере, я считаю, что это необычно).
Ответ №2:
- Побитово и.
- Я полагаю, что содержит, в этом контексте это более или менее сопоставление с
__contains__
, но оно появляется в документах Py3k. - Побитовое или.
- reduce выполняет итерацию по итерируемому объекту (параметр 2) и вызывает переданную функцию (параметр 1) для всех элементов. Он возвращает совокупное значение.
Ответ №3:
-
amp;
является побитовым оператором and. Человек, пишущий код, почти наверняка имел в видуand
, хотя для логических значений результат тот же. -
.contains()
это метод, предоставляемый web2py.a.contains(b)
более по-питоновски записывается какb in a
. -
|
является побитовым оператором OR. Опять же, они, вероятно, имели в видуor
. -
reduce
применяет функцию, указанную в качестве первого аргумента, к итерации во втором аргументе, слева направо, сначала с первыми двумя элементами, затем с результатом этого вычисления и третьим элементом и т.д.