Использование синтаксического анализатора Python GEDCOM: получение неверного вывода (экземпляр gedcom.Element при 0x00 ...) - PullRequest
0 голосов
/ 02 сентября 2010

Я новичок в Python и могу сказать, что мой опыт программирования является номинальным по сравнению со многими из вас.Готовьтесь :)

У меня есть 2 файла.Парсер GEDCOM, написанный на Python, который я нашел у пользователя на этом сайте (gedcom.py - http://ilab.cs.byu.edu/cs460/2006w/assignments/program1.html)), и простой файл GEDCOM, который я извлек из heiner-eichmann.de/gedcom/gedcom.htm. Угадайте, у кого естьпроблема в соединении 2 и 2? Этот парень ...

Вот фрагмент кода, за которым следует то, что я сделал до сих пор.

class Gedcom:
""" Gedcom parser

This parser is for the Gedcom 5.5 format.  For documentation of
this format, see

http://homepages.rootsweb.com/~pmcbride/gedcom/55gctoc.htm

This parser reads a GEDCOM file and parses it into a set of
elements.  These elements can be accessed via a list (the order of
the list is the same as the order of the elements in the GEDCOM
file), or a dictionary (the key to the dictionary is a unique
identifier that one element can use to point to another element).

"""

def __init__(self,file):
    """ Initialize a Gedcom parser. You must supply a Gedcom file.
    """
    self.__element_list = []
    self.__element_dict = {}
    self.__element_top = Element(-1,"","TOP","",self.__element_dict)
    self.__current_level = -1
    self.__current_element = self.__element_top
    self.__individuals = 0
    self.__parse(file)

def element_list(self):
    """ Return a list of all the elements in the Gedcom file.  The
    elements are in the same order as they appeared in the file.
    """
    return self.__element_list

def element_dict(self):
    """ Return a dictionary of elements from the Gedcom file.  Only
    elements identified by a pointer are listed in the dictionary.  The
    key for the dictionary is the pointer.
    """
    return self.__element_dict

мой маленький сценарий

import gedcom
g = Gedcom ('C: \ tmp \ test.ged') // Я в Windows
печать g.element_list ()

Изздесь я получаю кучу выходных данных "экземпляр gedcom.Element в 0x00 ..."

Я не уверен, почему я получаю этот вывод. Я думал, что в соответствии с методом element_list форматированный список будетвернулся. Я гуглил и ищу этот сайт. Ответ, вероятно, смотрит мне в лицо, но я надеялся, что кто-то может указать на очевидное.

Многое оценено.

Ответы [ 2 ]

1 голос
/ 02 сентября 2010

someclass instance at 0xdeadbeef является результатом стандартного метода __repr__ для классов, которые не определяют его, как, очевидно, не делает класс gedcom.Element, поэтому проблема заключается только в том, что вы распечатываете список таких экземпляров.Если такой класс определяет __str__, вы можете

for x in g.element_list():
    print x

, но если этого не произойдет, это также даст аналогичный вывод (так как __str__ "по умолчанию" __repr__).Что вы хотите сделать с этими элементами, например, метод, который их класс предлагает предложить?

0 голосов
/ 02 сентября 2010

Нет ничего плохого или необычного в этом выводе.Поскольку gedcom.Element не определил __repr__, при печати списка будет отображаться значение по умолчанию __repr__.Если вы хотите получить доступ к определенному атрибуту каждого элемента, вы можете попробовать:

print [element.some_attribute for element in g.element_list()]

edit: Ага, я просмотрел предоставленный вами источник.Он действительно определяет __str__, но не __repr__.Вот что вы хотите, скорее всего:

for element in g.element_list()
    print element
...