2016-08-15 3 views
-4

Я попытался преобразовать ast.Tuple в список, делая этотКак конвертировать ast.Tuple в список

mylist = list(mytuple) 

Однако я получаю ошибку Tuple object is not iterable. Есть ли способ конвертировать этот кортеж в список?

Кортеж в вопросе является Tuple из ast объектов, один из которых типа ast.Str, другие являющегося ast.Name. Моя конечная цель - создать строку из двух. Однако могут возникнуть ситуации, когда в кортежей имеется более двух элементов, поэтому мне нужно иметь возможность перебирать кортеж, чтобы проверить, какой тип объекта ast имеет каждый элемент.

Это сообщение об ошибке из интерпретатора

TypeError: 'Tuple' object is not iterable 

Это код, который произвел ошибку

if type(foo) is ast.Tuple: 
    g = list(foo) 
+0

@MartijnPieters Да, похоже, что они удалили кавычки из сообщения об исключении. Я получаю 'TypeError: объект 'Tuple' не является итерабельным'. –

+0

@MartijnPieters Я не согласен с вашей характеристикой вопроса как «вне темы». может отсутствовать информация, но это похоже на чрезвычайную и неуравновешенную реакцию. Во всяком случае, как я буду обновлять в OP, объект имеет тип ast.Tuple: 'if type (foo) is ast.Tuple:', что может объяснить, почему он не является итерируемым. – Leahcim

+0

@ Leahcim: Вопрос легко возобновляется. Ваш вопрос неполный и на него нельзя ответить в текущей форме. Это не по теме. –

ответ

2

У вас нет a tuple. У вас есть ast.Node subclass. Это имеет значение, узлы AST представляют дерево разбора, и хотя ast.Tuple может, в запущенном коде Python, привести к экземпляру tuple(), там отношения завершаются. Дерево разбора является промежуточным этапом между исходным кодом и байт-кодом, и только , выполненный bytecode производит фактические кортежи.

Узел класса АСТ имеет атрибуты, задокументированные в документации модуля ast и не могут быть итерабельными. Вы можете получить доступ к атрибутам _fields, lineno и col_offset, где _fields является итерируемым.

Для конкретного подкласса ast.Node обратитесь к Abstract Grammar section, чтобы узнать, какие другие типы узлов передаются для этого узла и по каким именам могут быть доступны другие объекты. Для ast.Tuple, что грамматика:

Tuple(expr* elts, expr_context ctx) 

так elts и ctx будут доступны как два атрибута, и elts последовательность, а также. Кстати, атрибут ast.Node._fields также называет эти атрибуты.

Если вы ищете «содержимое» кортежа, проанализированное в дереве, смотрите не дальше elts; это уже есть список:

>>> import ast 
>>> tree = ast.parse('("foo", bar)') 
>>> tree.body[0].value 
<_ast.Tuple object at 0x10262f990> 
>>> tree.body[0].value._fields 
('elts', 'ctx') 
>>> tree.body[0].value.elts 
[<_ast.Str object at 0x10262f910>, <_ast.Name object at 0x10262f6d0>] 
-1

Вы можете использовать

mylist = [x for x in mytuple] 
+4

Что такое 'list()' уже * делает *. OP фактически не имеет встроенного экземпляра 'tuple'. –

Смежные вопросы