Как я могу получить полный AST в Python?

Это будет делать одна строчка,

var ary = ['three', 'seven', 'eleven'];

// Remove item 'seven' from array
var filteredAry = ary.filter(function(e) { return e !== 'seven' })
//=> ["three", "eleven"]

// In ECMA6 (arrow function syntax):
var filteredAry = ary.filter(e => e !== 'seven')

. В JS используется функция фильтра . Поддерживается в IE9 и выше.

Что он делает (из ссылки на документацию)

filter () вызывает предоставленную функцию обратного вызова один раз для каждого элемента в массиве и создает новый массив из всех значений, для которых возвращается обратный вызов значение, которое приводит к истине. обратный вызов вызывается только для индексов массива, которым присвоены значения; он не вызывается для индексов, которые были удалены или которым никогда не присваивались значения. Элементы массива, которые не проходят тест обратного вызова, просто пропускаются и не включаются в новый массив.

Таким образом, в основном, это то же самое, что и все другие решения for (var key in ary) { ... }, за исключением того, что конструкция for in поддерживается в IE6.

По сути, фильтр - это удобный метод, который выглядит намного лучше (и является цепным) в отличие от конструкции for in (AFAIK).

5
задан laike9m 28 October 2018 в 09:13
поделиться

2 ответа

py> ast._fields
('body',)
py> ast.body
[<_ast.Import object at 0xb7978e8c>, <_ast.Expr object at 0xb7978f0c>]
py> ast.body[1]
<_ast.Expr object at 0xb7978f0c>
py> ast.body[1]._fields
('value',)
py> ast.body[1].value
<_ast.Call object at 0xb7978f2c>
py> ast.body[1].value._fields
('func', 'args', 'keywords', 'starargs', 'kwargs')
py> ast.body[1].value.args
[<_ast.Str object at 0xb7978fac>]
py> ast.body[1].value.args[0]
<_ast.Str object at 0xb7978fac>
py> ast.body[1].value.args[0]._fields
('s',)
py> ast.body[1].value.args[0].s
'.'

HTH

5
ответ дан 18 December 2019 в 14:49
поделиться

Таким образом вы получаете все дерево целиком - вплоть до самого низа - но оно СОЗДАЕТСЯ как дерево, именно ... поэтому на каждом уровне, чтобы получить детей, вы должны явно посещать необходимые атрибуты. Например (я называю compile result cf , а не ast , потому что это скроет модуль ast стандартной библиотеки - я предполагаю, что у вас только 2,5, скорее чем 2.6, поэтому вы используете вместо него модуль нижнего уровня _ast ?) ...:

>>> cf.body[0].names[0].name
'os'

Это то, что сообщает вам, что оператор импорта импортирует имя os (и только потому, что 1 - это длина поля .names в .body [0] , которое является импортом ).

In Python 2.6 ' В модуле ast вы также получаете помощников, позволяющих упростить навигацию по дереву (например, с помощью шаблона проектирования Visitor ) - но все дерево присутствует либо в 2.5 (с _ast ) или 2.5 (с ast ), и в любом случае представлен точно таким же образом.

Для удобного посещения всех узлов в дереве в 2.6 используйте модуль ast (без символа подчеркивания в начале) и подкласс ast.NodeVisitor по мере необходимости (или эквивалентно рекурсивно используйте ast.iter_child_nodes и ast.iter_fields по мере необходимости). Конечно, эти помощники могут быть реализованы на чистом Python поверх _ast , если вы по какой-то причине застряли в 2.5.

с помощью шаблона проектирования Visitor ), но все дерево присутствует либо в 2.5 (с _ast ), либо в 2.5 (с ast ), и в любом случае представлен точно таким же образом.

Чтобы удобно посещать все узлы в дереве, в 2.6 используйте модуль ast (без подчеркивания в начале) и подкласс ast.NodeVisitor в зависимости от ситуации (или эквивалентно используйте ast.iter_child_nodes рекурсивно и ast.iter_fields по мере необходимости). Конечно, эти помощники могут быть реализованы на чистом Python поверх _ast , если вы по какой-то причине застряли в 2.5.

шаблоном проектирования Visitor ), но все дерево присутствует либо в 2.5 (с _ast ), либо в 2.5 (с ast ), и в любом случае представлен точно таким же образом.

Чтобы удобно посещать все узлы в дереве, в 2.6 используйте модуль ast (без подчеркивания в начале) и подкласс ast.NodeVisitor в зависимости от ситуации (или эквивалентно используйте ast.iter_child_nodes рекурсивно и ast.iter_fields по мере необходимости). Конечно, эти помощники могут быть реализованы на чистом Python поверх _ast , если вы по какой-то причине застряли в 2.5.

используйте модуль ast (без начального подчеркивания) и подкласс ast.NodeVisitor в зависимости от ситуации (или эквивалентным образом используйте рекурсивно ast.iter_child_nodes и ast.iter_fields по мере необходимости). Конечно, эти помощники могут быть реализованы на чистом Python поверх _ast , если вы по какой-то причине застряли в 2.5.

используйте модуль ast (без начального подчеркивания) и подкласс ast.NodeVisitor в зависимости от ситуации (или эквивалентным образом используйте рекурсивно ast.iter_child_nodes и ast.iter_fields по мере необходимости). Конечно, эти помощники могут быть реализованы на чистом Python поверх _ast , если вы по какой-то причине застряли в 2.5.

8
ответ дан 18 December 2019 в 14:49
поделиться
Другие вопросы по тегам:

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