Python中的全局变量:进行比较时获取名称



我正在尝试在Python中实现SAX解析器。读取XML并创建对象。以下是我的代码。

import xml.sax
class Employee :
    def __init__(self, id):
        self.id = id

class EmployeeHandler(xml.sax.ContentHandler):
    emp = None
    emplist = []
    fName = False
    lName = False
    age = False
    company = False
    def __init__(self):
        xml.sax.ContentHandler.__init__(self)
    def startElement(self, name, attrs):
        print("startElement '" + name + "'")
        if name == "Employees" :
            global emplist
            emplist = []
        if name == "Employee":
            global emp
            emp = Employee(attrs.getValue("id"))
        elif name == "FirstName":
            global fName
            fName = True
        elif name == "LastName":
            global lName
            lName = True
        elif name == "Age":
            global age
            age = True
        elif name == "Company":
            global company
            company = True
    def characters(self, content):
        print("characters '" + content + "'")
        global fName, lName, age, company
        if fName is True:
            emp.firstName = content
        elif lName is True:
            emp.lastName = content
        elif age is True:
            emp.age = content
        elif company is True:
            emp.company = content

    def endElement(self, name):
        print("endElement '" + name + "'")
        if name == "Employee":
            #global emplist : To use list methods global is not required
            emplist.append(emp)

def main(sourceFileName):
    source = open(sourceFileName)
    xml.sax.parse(source, EmployeeHandler())

if __name__ == "__main__":
    main("EmployeeData")
    print("Ids ", emplist[0].id , emplist[1].id)

执行代码时,我会收到以下错误:

 File "C:/Users/611834094/PycharmProjects/PractiseProject/xml_pratise/saxparser.py", line 47, in characters
    if fName is True:
NameError: name 'fName' is not defined

确切地说,以下块正在引起错误:

def characters(self, content):
    print("characters '" + content + "'")
    global fName, lName, age, company
    if fName is True:
        emp.firstName = content

变量fName(以及其他全局变量(是用一个初始值来定义的,该值在处理程序的startElement()方法中已更改,在字符方法中,我试图比较fname对True(boolean(的值,我收到的错误如上所述。

谢谢

我将拿一些代码的片段:

class EmployeeHandler(xml.sax.ContentHandler):
    ....
    fName = False
    ....
      elif name == "FirstName":
            global fName
            fName = True
     ....
         global fName, lName, age, company
         if fName is True:

global关键字使fName成为全局外部类。要使用类变量fName,您应该以类名称为前面:

      elif name == "FirstName":
            EmployeeHandler.fName = True
      ....
            if EmployeeHandler.fName is True:

说过,这些变量似乎都不适合 class 变量,似乎它们实际上应该是对象实例变量,即附加到 self,如@jessebakker所述。他们似乎是每个员工的属性,而不是整个班级的属性。

这不起作用的原因是您没有定义任何全局变量。取而代之的是,您的类成员定义了,这些成员不是全球范围的,而是在对象中进行范围。这些可以通过自我参数访问,这是类实例:

if self.fName:
    self.emp.firstName = content

etc

最新更新