Вы можете использовать функцию, которая ищет оператор OR
или AND
в заданном списке токенов и нарезает список по индексу, где он найден, и рекурсивно обрабатывает два нарезанных списка с обеих сторон. оператора и примените соответствующие методы (Q.__or__
и Q.__and__
) к возвращаемым Q
объектам. Если оператор не найден, вернуть новый объект Q
со ссылочными данными запроса:
def q(query, tokens):
if isinstance(tokens, list):
for operator in ('OR', 'AND'): # OR first since it has a lower precedence than AND
try:
index = tokens.index(operator)
break
except ValueError:
pass
else:
return q(query, tokens[0])
return (Q.__or__ if operator == 'OR' else Q.__and__)(
q(query, tokens[:index]), q(query, tokens[index + 1:]))
else:
d = query[int(tokens)]
return Q(**{'__'.join((d['field'], d['operator'])): d['value']})
, так что с учетом:
tokens = [[['1', 'OR', '2', 'OR', '4'], 'AND', '4']]
query = {'logic': u'(1 OR 2 OR 4) AND 4',
'query': [{u'field': u'first_name',
u'id': 1,
u'opertor': u'icontains',
u'value': u'A'},
{u'field': u'first_name',
u'id': 2,
u'opertor': u'icontains',
u'value': u'b'},
{u'field': u'show_tag',
u'id': 3,
u'opertor': u'includes',
u'value': u'1955'},
{u'field': u'organisation__organisation_name',
u'id': 4,
u'opertor': u'icontains',
u'value': u'a'}]}
query = {q['id']: q for q in query['query']} # transform the above to a dict indexed by id
q(query, tokens)
должен вернуть Q
объект, который вам нужен.
Отказ от ответственности: я не проверял этот код.
«Знание» языка программирования очень похоже на «знание» человеческого языка - вы бегло говорите, когда вам не нужно постоянно перелистывать книгу или делать паузу запомнить правильное слово.
Я думаю, что «знание языка» означает способность читать и понимать большинство программ (~ 90%), не ища ничего в справочном ресурсе, и точно зная, куда обратиться, чтобы найти технические подробности о более непонятных частях фреймворк. Для языков / платформ, которые сами по себе не имеют «фреймворка», он обладает знаниями об основных библиотеках, общепринятых в сообществе.
Для написания на этом языке это означает тратить ~ 90% + время на дизайн того, что вы пишете, включая исследования дизайна, и менее 10% ищут техническую справочную информацию.
и точно знать, куда идти, чтобы найти технические подробности о более непонятных частях каркаса. Для языков / платформ, которые сами по себе не имеют «фреймворка», он обладает знаниями об основных библиотеках, общепринятых в сообществе.Для написания на этом языке это означает тратить ~ 90% + время на дизайн того, что вы пишете, включая исследования дизайна, и менее 10% ищут техническую справочную информацию.
и точно знать, куда идти, чтобы найти технические подробности о более непонятных частях каркаса. Для языков / платформ, которые сами по себе не имеют «фреймворка», он обладает знаниями об основных библиотеках, общепринятых в сообществе.Для написания на этом языке это означает тратить ~ 90% + время на дизайн того, что вы пишете, включая исследования дизайна, и менее 10% ищут техническую справочную информацию.
Действительно «знание» языка для описания себя как «хорошего» означает
С учетом строки кода на языке X эта строка записывается один раз и, вероятно, будет прочитана еще много раз (и потенциально модифицированный, конечно). Таким образом, владение языком - это, в значительной степени, понимание прочитанного. Для корпуса программ, написанных на X, как быстро вы можете прочитать программы и понять, что они делают?
Знает ли он
Если вы имеете в виду определенный язык, хорошим тестом является поиск в нем серьезных примеров. В случае C, читая (например) ядро Linux, утилиты GNU OS, PostgreSQL или Subversion, и выяснение того, как они работают , является не только указанием, но и хорошей практикой.
[1] Было одно задание о статическом анализе байт-кода; но фактическое решение могло быть написано во что угодно.
Я думаю, что это действительно зависит от определения «хорошо» или цели «быть хорошим».
Например, давайте рассмотрим Java.
Большинство заданий не согласятся с тем, что вы хорошо владеете базовым языком, они ожидают, что вы разбираетесь в определенных API (например, Swing для GUI) или даже в третьих. сторонние API (как и все вещи Apache). Вам не обязательно знать каждый случай.
Академические и промышленные исследования могут потребовать, чтобы вы действительно знали язык внутри и снаружи. Например, если вы пишете инструмент статического анализа или оптимизацию компилятора, лучше знать о крайних случаях.
В образовании и в QA часто важно знать все странные углы и их риски. Это типично для C ++. В образовании, потому что вы можете рассчитывать на то, что студенты допустят эти ошибки случайно. В QA, потому что именно там лежат некоторые странные ошибки (например, условия гонки в статической инициализации).
Что касается того, как реализованы функции, я думаю, что вы можете быть отличным программистом, не зная, как реализованы определенные вещи (например, детали VTBL в C ++), но важно знать, как реализованы другие вещи (например, сборка мусора, управление памятью, некоторые библиотеки), чтобы написать действительно хороший и эффективный код.
По-моему, это означает, что вы можете думать на этом языке. Возможность видеть части кода, возникающие у вас в голове при прохождении постановки задачи, является хорошим показателем того, насколько вы владеете языком.
Учитывая алгоритм , если вы можете реализовать решение , которое
Я думаю, что вы знаете язык лучше ...