【问题标题】:Global variable in Python : Getting NameError while performing a comparison [duplicate]Python中的全局变量:执行比较时出现NameError [重复]
【发布时间】:2018-02-10 13:01:55
【问题描述】:

我正在尝试在 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),我收到了上面提到的错误。

谢谢

【问题讨论】:

标签: python python-3.x parsing sax


【解决方案1】:

我只截取你的一些代码片段:

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 所述。它们似乎是每个 Employee 的属性,而不是整个班级的属性。

【讨论】:

    【解决方案2】:

    这不起作用的原因是您没有定义任何全局变量。相反,您定义了类成员,它们不是全局范围的,而是对象中的范围。这些可以通过 self 参数访问,也就是类实例:

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

    【讨论】:

    • 感谢杰西的回复。如果您在 EmployeeHandler 类中声明了以下全局变量 .emp = None emplist = [] fName = False lName = False age = False company = False ,更改 startElemen() 方法中的值并在 characters() 方法中进行比较。跨度>
    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2015-08-19
    • 2013-09-06
    相关资源
    最近更新 更多