我正在尝试创建一个捆绑所有包装器的类。我正在尝试创建自定义etree方法,我可以在我制作的所有项目中使用它们。
当我尝试执行以下操作时,我收到名称错误。
class ObjectWrapper(object):
from lxml import etree
@classmethod
def stringify(cls, root):
return etree.tostring(root, pretty_print=True)
@classmethod
def node_creator(cls, parent, child):
ch_node = etree.Element(child)
parent.append(ch_node)
print "Child Node Created"
return ch_node
将此类视为以下结构。
TopModule
|
|
|
|_
object_wrapper.py
|
|
|
|_
ObjectWrapper()
当我从TopModule.object_wrapper导入ObjectWrapper时,我收到错误说
Name error: global name "etree" is not defined
如果我进行全局导入并将classmethods变为静态方法,也会发生同样的情况。
有什么建议吗?
答案 0 :(得分:1)
你所拥有的是一个范围问题。
etree在类中定义,但在方法中没有作用域。
要解决这个问题,请在方法中声明global ET
,以便他们了解变量。在这种情况下,lxml.etree
必须导入as
某些内容,以便可以使用global
引用它。如果您不想使用global
,请在from lxml import etree
之上和之外声明class
。
class ObjectWrapper(object):
import lxml.etree as ET
@classmethod
def stringify(cls, root):
global ET
return ET.tostring(root, pretty_print=True)
@classmethod
def node_creator(cls, parent, child):
global ET
ch_node = ET.Element(child)
parent.append(ch_node)
print "Child Node Created"
return ch_node
或另一种选择......
from lxml import etree
class ObjectWrapper(object):
@classmethod
def stringify(cls, root):
return etree.tostring(root, pretty_print=True)
@classmethod
def node_creator(cls, parent, child):
ch_node = etree.Element(child)
parent.append(ch_node)
print "Child Node Created"
return ch_node