2016-06-29 9 views
2

Это происходит постоянно. Функция возвращает объект, который я не могу прочитать. Здесь:Python TypeError: объект «TagList» не итерируется

discoverer = GstPbutils.Discoverer() 
    discoverer.connect('discovered', on_discovered) 
    info = discoverer.discover_uri(self.loaded_file) 
    print(vinfo.get_tags()) 

возвращает это:

<Gst.TagList object at 0x7f00a360c0a8 (GstTagList at 0x7f00880024a0)> 

Но когда я пытаюсь сделать это:

tags = vinfo.get_tags() 
    for tag in tags: 
     print (tag) 

я получаю это:

TypeError: 'TagList' object is not iterable 

Но когда я прочитал the doc of this data structure , Я, кажется, понимаю, что это ... Список? Может кто-нибудь, кроме того, что я расскажу, как получить теги, укажите мне как читать те документы? Кроме того, не хватает ли некоторых методов и инструментов интроспекции, которые я мог бы использовать, чтобы узнать, с какими объектами сталкиваются, и как они работают?

ответ

1

Это все гипотетическое, как я никогда не использовал питон с GStreamer:

Согласно документации - да он сказал, что его список .. но это может быть представлено в виде внутренней структуры .. помнить, что питон привязок просто .. bindings - все работает аналогично (если не реализовано лучше), как в C .. и что вы делаете в C with tags to iterate them .. но не спрашивайте меня, как я это нашел - вам нужно осмотреть документы, проверяющие все доступные функции ,

Вы должны быть мудрыми и думать о том, как можно использовать объект, который вы используете, - вместе с тем, что вы знаете, что он представляет. Я имею в виду - это список тегов, когда каждый тег имеет другой тип - одна строка, другая - int и т. д., вы не можете легко перебирать ее.

Так что я думаю, что у вас есть два варианта - в зависимости от того, что вы хотите сделать с тегами ..

1, сериализовать в строку и работать с этим:

Я не уверен, но в C есть to_string, который может делать то же самое, что и в to_string в python - так что попробуйте, если вас интересуют только имена тегов .. или что бы то ни было.

2, используйте встроенную foreach с определением обратного вызова:

tags = vinfo.get_tags() 
tags.foreach(my_callback, self) 

И обратного вызова:

def my_callback(list, tag, user_data): 
    print(tag) 
    #do whatever you want with list 
    #not sure how to use casting in python: 
    YourClass ptr = user_data 
    ptr.your_method(whatever, tag);