1

我正在尝试将属性注入lxml.etree._Element,但由于该模块完全用 C 实现,因此setattr失败:

Traceback (most recent call last):
[...]
    setattr(node.getroottree().getroot(), "attributeName", value)
AttributeError: 'lxml.etree._Element' object has no attribute 'attributeName'

用例:我有一个函数,它通过 XPath 从 XML 文件中提取文本,并用$(ENV)相应的值替换类似的匹配项。因此,我不想每次都传递变量字典(例如{"ENV" : "replacement"},每次都传递给该函数。相反,在固定位置(我的代码中的 XML 根)拥有一个属性会更容易。我可以做一个愚蠢的解决方法,但是注入 Python 属性是最好的方法。我不能使用全局变量,因为每个 XML 文件可以有不同的变量值。

那么,有什么方法可以将某些东西注入基于 C 的类/对象中?

4

1 回答 1

-1

您通常不能,因为 C 定义类型的实例通常没有每个实例__dict__条目来保存任意属性。

对于子类或包装类不起作用的情况,一种解决方法是在模块级别创建一个帮助字典,将您拥有的对象映射到其他信息。如果您拥有的对象不可散列,则可以id(obj)改用。

因此,例如,您可以存储与每个根对象的 id 关联的字典:

# Module level, setting up the data store
from collections import defaultdict
extra_info = defaultdict(dict) # Creates empty dicts for unknown keys

# Saving the info
root = node.getroottree().getroot()
extra_info[id(root)]["ENV"] = "replacement"

# Retrieving it later
root = node.getroottree().getroot()
info = extra_info[id(root)]
于 2011-02-24T08:05:56.163 回答