【问题标题】:Bundling method wrappers捆绑方法包装器
【发布时间】:2014-10-30 13:11:27
【问题描述】:

我正在尝试创建一个捆绑我所有包装器的类。我正在尝试创建可以在我制作的所有项目中使用的自定义 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

如果我进行全局导入并将类方法变成静态方法,也会发生同样的情况。

有什么建议吗?

【问题讨论】:

  • 不应将from lxml import etree 置于您的class__init__ 之上?
  • 真快,用那个方法,在返回之前,试试global etree。由于在类中声明了etree,但未限定在方法范围内,可能是范围问题
  • @Vizjerei 是的,我同意。但我不想进行全球进口。将 object_wrapper.py 视为具有包装器的类的集合。我正在尝试在特定类中进行导入。 (我可能做错了,我只是想知道这是否可能)

标签: python class methods import module


【解决方案1】:

您所拥有的是范围界定问题。 etree 在类中定义,但不在方法范围内。 要解决此问题,请在方法中声明 global ET,以便他们了解变量。在这种情况下,lxml.etree 必须导入 as,以便可以使用 global 引用它。如果您不想使用global,请在class 的上方和外部声明from lxml import etree

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

【讨论】:

  • 声明全局对我没有帮助。相同的Name error。而全局导入始终有效。
  • 您确定您也更改了import 吗?我测试了我发布的两个示例,都没有NameError
  • 是的,我更改了导入。编辑器(IntelliJ)将其报告为Global variable ET is undefined at module level.,它返回给我Name Error
  • 这很奇怪。如果是这种情况,请使用我提供的第二个示例并在 class 之外声明导入
  • 你可以。您可以在任何地方声明导入。您声明导入的位置决定了该导入的范围。在 classmethod 内部声明 global 将使其首先在全局级别检查该变量,在这种情况下检查类。我不确定为什么 IntelliJ 会在我的第一个示例中报告 NameError,Eclipse、记事本,甚至命令行都没有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多