Как я могу решить ошибку импорта, если «я» не определен глобально в Python? - PullRequest
3 голосов
/ 09 ноября 2011

Так что я продолжаю получать эту ошибку, что, когда я использую Google для нее, самое распространенное исправление - это убедиться, что все методы класса имеют «self» в качестве первого аргумента. Вот ошибка:

File "C:\Users\me\Documents\Project\code\model\TrainEvent.py", line 9, in NameError: global name 'self' is not definedPress any key to continue . . .

Это похоже на обычную ошибку с простым исправлением, за исключением того, что все мои методы имеют self в качестве первого аргумента. Затем я понял, что traceback просто указывает на строку, где объявлено имя класса. Он не указывает на строку, где я вызываю метод с self. Эта ошибка возникает задолго до этого. На самом деле, это похоже на импорт при импорте. Вот TrainEvent.py.

    from xml.etree.ElementTree import Element

    class TrainEvent(object):

        def __init__(self, element):
            self._element = element
            self.MsgId = self.__tagGrab('MsgId')
            self.MsgTime = self.__tagGrab('MsgTime')
            self.Offset = self.__tagGrab('Offset')
            self.TranId = self.__tagGrab('TranId')
            self.Portal = self.__tagGrab('Portal')
            moveElem = self._element.find('Move')
            self.StartTime = self.__tagGrab('StartTime', moveElem)
            self.EndTime = self.__tagGrab('EndTime', moveElem)
            self.Type = self.__tagGrab('Type', moveElem)
            carElem = self._element.find('Car')
            self.Name = self.__tagGrab('Name', carElem)
            self.UniqueId = self.__tagGrab('UniqueId', carElem)
            self.Orientation = self.__tagGrab('Orientation', carElem)
            self.Wells = self.__tagGrab('Wells', carElem)
            self.Axles = self.__tagGrab('Axles', carElem)
            self.Length = self.__tagGrab('Length', carElem)
            self.IsEngine = self.__tagGrab('IsEngine', carElem)
            self.IsGhost = self.__tagGrab('IsGhost', carElem)

        def getTree(self):
            aTree = Element('ApsMessage')
            self.__addTag(aTree, 'MsgId', self.MsgId)
            self.__addTag(aTree, 'MsgTime', self.MsgTime)
            self.__addTag(aTree, 'Offset', self.Offset)
            self.__addTag(aTree, 'TranId', self.TranId)
            self.__addTag(aTree, 'Portal', self.Portal)
            moveElem = Element('Move')
            self.__addTag(moveElem, 'StartTime', self.StartTime)
            self.__addTag(moveElem, 'EndTime', self.EndTime)
            self.__addTag(moveElem, 'Type', self.Type)
            aTree.append(moveElem)
            carElem = Element('Car')
            self.__addTag(carElem, 'Name', self.Name)
            self.__addTag(carElem, 'UniqueId', self.UniqueId)
            self.__addTag(carElem, 'Orientation', self.Orientation)
            self.__addTag(carElem, 'Wells', self.Wells)
            self.__addTag(carElem, 'Axles', self.Axles)
            self.__addTag(carElem, 'Length', self.Length)
            self.__addTag(carElem, 'IsEngine', self.IsEngine)
            self.__addTag(carElem, 'IsGhost', self.IsGhost)
            aTree.append(carElem)
            return aTree

        def getTag(self):
            return self._element.tag

        def __tagGrab(self, tagName, parent=self._element):
            '''
            Helper function for XML reading operations.
            '''
            return parent.find(tagName).text


        def __addTag(self, element, tagName, textValue=None):
            '''
            Helper function for setting values for XML elements. Note that this
            function assumes unique tag name values within element.
            '''
            element.append(Element(tagName))
            if textValue:
                element.find(tagName).text = str(textValue)

Так что, если все мои методы имеют self для первого аргумента и стек вызовов указывает на объявление класса как проблему, но для self не определяется глобально, то что я тут не так сделал?

PS: Если это вообще поможет, я использую последнюю версию интерпретатора IronPython на случай, если по какой-то причине проблема связана с IronPython.

1 Ответ

11 голосов
/ 09 ноября 2011

Проблема в вашей __tagGrab функции:

def __tagGrab(self, tagName, parent=self._element):

Вы не можете иметь self в заголовке - лучше иметь None и затем исправить в теле:

def __tagGrab(self, tagName, parent=None):
    if parent is None:
        parent = self._element
    ...

Причина в том, что при создании объекта класса нет self; кроме globals() (который имеет Element плюс несколько других элементов), единственными именами, определенными, когда Python достигает __tagGrab, являются __module__, __init__, getTree и getTag.

В качестве эксперимента, чтобы доказать это себе, попробуйте следующее:

class TestClassCreation(object):
    print("Started creating class")
    print("names so far: %s" % vars())

    def __init__(self):
        pass
    print("now we have %s" % vars())

    def noop(self, default=None):
        print("this gets run when noop is called")
    print("and now have %s" % vars())
    print()

    print("and now we'll fail...")
    def failure(self, some_arg=self.noop):
        pass
    print("we never get here...")
...