2014-11-21 1 views
-1

Я новичок в Python & сталкиваются проблемами при доступе второго элемента iterateable возвращенного функцией от Lib PyYAML, yaml.load_all, ниже код:Как элемент доступа в индексе генератора в python?

import os 
import yaml 
file = "abc.yaml" 
stream = open(file) 
docs = yaml.load_all(stream) 
print docs[1] 

выхода я получаю

TypeError: 'NoneType' object has no attribute '__getitem__' 

yaml является python lib для обработки yaml format, yaml.load_all пояснил here

+2

'docs' в этом случае фактически' None', а не итерируемый. Можете ли вы представить полный пример кода? Что такое 'yaml' в этом случае? Откуда это? – Ffisegydd

+0

Как сказал @Ffisegydd, в этом случае это 'Нет'. Если бы он был итерабельным, вы могли бы использовать функцию 'next', чтобы получить следующий элемент из iterable. –

+0

, но тогда я могу сделать для этого, например: 'для документов в документах: print doc' – Shashank

ответ

0

Если вам нужен только один документ, то это должно сделать:

docs = yaml.load_all(...) 
next(docs) # skip docs[0] 
mydoc = next(docs) 
0

Сообщение об ошибке Вы упоминаете (TypeError: 'NoneType' object has no attribute '__getitem__') не приходит от docs быть генератором, а от docs быть None.

Но в любом случае, чтобы ответить на ваш вопрос: вы не можете «получить доступ к элементу по индексу в генераторе», поскольку генератор не подлежит индексированию - вся точка генераторов должна генерировать значения «на лету». Если вам действительно нужна subscriptable последовательность, самый простой способ заключается в создании list от вашего генератора, а именно:

docs = list(yaml.load_all(stream)) 

Теперь остерегайтесь, что вы не хотите делать это, если вы не знаете наверняка, что: 1. Ваш генератор не бесконечен (генераторы могут быть бесконечными, а некоторые -) и 2. список поместится в памяти.

NB: Здесь используется слово «генератор», но оно применимо к итераторам в целом.