NameError: глобальное имя 'getAllElements' не определено при вызове функции класса - PullRequest
1 голос
/ 09 февраля 2012

Я, вероятно, что-то пропускаю, но у меня есть класс "parse" с функцией "getAllElements".В основном скрипте я импортирую синтаксический анализ, используя

from parseXML import parse. 

Затем я делаю

parse = parse(file) 

, который работает нормально.Но когда я делаю

print parseXML.parse(file).getAllElements()

, я получаю следующую ошибку:

NameError: global name 'getAllElements' is not defined 

Ниже приведен код.Куда я иду не так?

Редактировать: изменил код после комментария

class parse:
    # Constructor
    def __init__(self, file):
        # parse the xml file into a tree
        tree = xml.parse('/homes/ndeklein/test.featureXML')
        # Get the root node of the xml file
        self.rootElement = tree.getroot()
        # Set self.parent to rootElement, because the first element won't have a parent (because it is the root)
        self.parent = 'rootElement'
        # dictionary that contains the parent -> child relation
        self.parentChildDict = {}

    # Go recursively through all the elements in the xml file, starting at the choosen rootElement, until only leaves (elements that don't contain elements) are left
    # Return all the elements from the xml file
    def getAllElements(self):
        # if this is the first time this parent is seen:
        #     make elementDict with parent as key and child as value in a list
        if not self.parentChildDict.has_key(self.parent):
            self.parentChildDict[self.parent] = [self.rootElement]
        # else: add the child to the parent dictionary
        else:
            self.parentChildDict[self.parent].append(self.rootElement)
        for node in self.rootElement:
            # if the len of rootElement > 0 (there are more elements in the element):
            #    set self.parent to be node and recursively call getAllElements
            if len(self.rootElement) > 0:
                self.parent = node
                getAllElements()
        return self.parentChildDict

.

#!/usr/bin/env python

# author: ndeklein
# date: 08/02/2012
# function: calls out the script

import parseXML
import xml.etree.cElementTree as xml
import sys

#Parse XML directly from the file path
file = '/homes/ndeklein/EP-B1.featureXML'
# parse the xml file into a tree
print parseXML.parse(file).getAllElements()

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Это ваш импорт и стиль звонка, на что ссылался Правин.

Поскольку вы импортируете таким образом:

from foo import bar

Вы не должны (и фактически не должны) явно объявлять foo в своем вызове.

bar.baz()

Не

foo.bar.baz()

Так что в вашем случае попробуйте позвонить:

parse(file).getAllElements()

Но вам все равно нужно обратиться к голому вызову в вашей рекурсии: getAllElements () вероятно должен быть self.getAllElements ()

1 голос
/ 09 февраля 2012

Похоже, parseXML не находится в вашем локальном пространстве имен, потому что вы делаете from parseXML import parse.Вы пытались импортировать parseXML напрямую и делать это вместо этого?

import parseXML 
parseXML.parse(file).getAllElements()

Вы получаете NameError, потому что вы не можете просто вызвать getAllElements() внутри метода.Это должно быть self.getAllElements().

Как уже упоминалось в комментариях, в коде есть и другие логические ошибки, которые вам необходимо исправить.

...