我在“datetime”的例子中停止它,在lxml的一个真实例子中重写。
(这可能很奇怪,因为英文是在谷歌翻译中翻译的,我很抱歉。)
据认为我喜欢 lxml 的性能非常好,但源代码很难阅读。
如果你积极使用XML,我也可以经常修改python的代码。
时间已经过去了,因为忘记了,源码因为很难理解,
我花时间调试和修复。
例如,我认为通常当您搜索如下:深层 XML 层次结构。
elem = lxml.etree.parse ("xxx/xxx/sample.xml").getroot()
elem.xpath("//depth3/text()")[0]
elem.find("./depth1/depth2/depth3").get("attr1").text
我想如下使用。
(使用此代码它只是我。)
elem.depth3.text (Ex.1)
OR
elem.depth1.depth2.depth3.text (Ex.2)
我试过类继承是先实现这个的。
您已经通过参考“在 lxml 中使用自定义元素类”进行了一些自定义。
我使用__getattr__
来搜索 XML 元素。
from lxml import etree
class CustomElement (etree.ElementBase):
def __ getattr__ (self, k):
ret = self.xpath ("/ /" + k)
setattr(self, k, ret)
return getattr(self, k)
(Ex.1)成功的例子。
但是(Ex.2)的例子在etree._Element depth1的返回实例中变成了Attribute Error __getattr__
is not present。
虽然不是(补充)实用,但我使用了一个示例,在 Easy to understand 的第一个问题中添加了“日期时间”的“毫秒”。
当时认为这是一种使用 ctypes 模块向 lxml 的 Element 类添加函数的方法。
import ctypes
import lxml.etree
class PyObject_HEAD(ctypes.Structure):
_fields_ = [
('HEAD', ctypes.c_ubyte * (object.__basicsize__ -
ctypes.sizeof(ctypes.c_void_p))),
('ob_type', ctypes.c_void_p)
]
def __getattr__(self, k):
ret = self.xpath("//" + k)
setattr(self, k, ret)
return getattr(self, k)
_get_dict = ctypes.pythonapi._PyObject_GetDictPtr
_get_dict.restype = ctypes.POINTER(ctypes.py_object)
_get_dict.argtypes = [ctypes.py_object]
EE = _get_dict(lxml.etree._Element).contents.value
EE["__getattr__"] = __getattr__
elem = lxml.etree.parse("xxx/xxx/sample.xml").getroot()
elem.xpath("//depth3")[0]
=> 返回 _Element 对象
from ispect import getsource
print getsource(elem.__getattr__)
=>def __getattr__
(self, k):
=> ret = self.xpath("//" + k)
=> setattr(self, k, ret)
=> return getattr(self, k)
源被添加..
elem.depth3
=> AttributeError .. no attribute 'depth3'
我不知道是否或应该写如何使用“PyObject_GetAttr”。
请告诉我是否。
最好的问候
====================上一个问题========================== =========
我正在尝试增强 ctypes。添加功能通常很顺利。但是,如果添加特殊方法,它不起作用,为什么?
import ctypes as c
class PyObject_HEAD(c.Structure):
_fields_ = [
('HEAD', c.c_ubyte * (object.__basicsize__ -
c.sizeof(c.c_void_p))),
('ob_type', c.c_void_p)
]
pgd = c.pythonapi._PyObject_GetDictPtr
pgd.restype = c.POINTER(c.py_object)
pgd.argtypes = [c.py_object]
import datetime
def millisecond(td):
return (td.microsecond / 1000)
d = pgd(datetime.datetime)[0]
d["millisecond"] = millisecond
now = datetime.datetime.now()
print now.millisecond(), now.microsecond
这打印155 155958
,好的!
def __getattr__(self, k):
return self, k
d["__getattr__"] = __getattr__
now = datetime.datetime
print now.hoge
这不起作用,为什么?
Traceback (most recent call last):
File "xxxtmp.py", line 31, in <module>
print now.hoge
AttributeError: type object 'datetime.datetime' has no attribute 'hoge'