#javascript #return-value #python-3.7 #return-type
#язык JavaScript #возвращаемое значение #python-3.7 #возвращаемый тип
Вопрос:
Я работаю над переводом некоторого кода с JavaScript на Python.
В Javascript я вижу много обработки множества условий внутри оператора return. Вот пример:
return '(' Object.entries(query).map((kv) =gt; { const key = getCols(kv[0], table) if (kv[0] === '$or') { return '(' getQuery(kv[1], table).join(' OR ') ')' } else if (kv[0] === '$null') { return format('%s IS NULL', kv[1]) } else if (kv[0] === '$notnull') { return format('%s IS NOT NULL', kv[1]) } else if (kv[0] === '$not') { return 'NOT (' getQuery(kv[1], table) ')' } else if (kv[0] === '$arrayany') { return Object.entries(kv[1]) .map((x) =gt; { return format('%s=ANY(%L)', getCols(x[0], table), value(x[1])) }) .join(' AND ') ')'
Я не видел таких сложных операторов возврата в Python и не уверен, как построить эквивалентный оператор с учетом всех отображений и соединений. Каков действительный питонский способ иметь такие глубоко вложенные операторы возврата?
Комментарии:
1. Как вы представляете объекты, как
query
в python? Это простыеdict
буквы «с»?2. В общем:
Object.entries(obj) -gt; obj.items()
,arr.join(string) -gt; string.join(arr)
,arr.map(cb) -gt; map(cb, arr)
это должно решить 90% конверсии. Предполагая, что вы преобразуете объекты JavaScript в pythondict
s. Также:format(template, val1, val2, ...) -gt; template.format(val1, val2, ...)
но замените%lt;Xgt;
на{}
.3. Спасибо! И что касается операторов возврата — часто ли в Python используются такие глубоко вложенные операторы возврата? Я могу перевести каждый из битов самостоятельно, но объединение всего этого в оператор возврата, подобный Javascript, создает множество
unreachable code
ошибок.4. ИМХО, этот код был бы более читабельным, разделенным на пару функций… Код должен выглядеть примерно так:
return '(' format_query(query, table) ')'
иformat_query
я ожидал бы , что это будет что-то вроде' AND '.join(format_query_part(key, value) for key, value in query.items())
, сformat_query_part
тем, что содержит последовательностьif/elif/else
s.5. Спасибо за это. Я собираюсь попробовать поработать с этой идеей.