【问题标题】:Really weird... can't set attributes of built-in/extension type 'lxml.etree._Element'真的很奇怪......无法设置内置/扩展类型'lxml.etree._Element'的属性
【发布时间】:2017-08-19 16:27:52
【问题描述】:

我之前更改了其他类的属性没有问题。 _Element 显然不是内置的。

from lxml.etree import _Element
_Element.new_attr = 54

结果:

TypeError: 无法设置内置/扩展类型“lxml.etree._Element”的属性

【问题讨论】:

  • 如果我使用禁止的水果作为解决方法,效果很好。仍然很好奇为什么这是必要的

标签: python mocking lxml monkeypatching


【解决方案1】:

_Elementimplemented in Cython。作为Steve Holden explains(我的重点),

问题是扩展类型的属性由 对象插槽的布局并永远固定在 C 代码中 实现它们:插槽无法扩展,因此无法添加 属性。这是一个效率特性:它会非常慢 使用后期绑定查找基本类型的属性(它也会 稍微改变语言的性质,使其更像 Ruby 或 自我)。

Guido van Rossum 解释了原因this is by-design

这是故意禁止的,以防止意外的致命更改 内置类型(对你从未想过的部分代码是致命的 的)。此外,这样做是为了防止更改影响不同的 驻留在地址空间中的解释器,因为内置类型 (与用户定义的类不同)在所有此类之间共享 口译员。

【讨论】:

【解决方案2】:

_Element 类来自 Cython 编译的二进制模块。这些不是 Python 第一公民对象,您不能向此类对象添加任意属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-10
    • 2012-07-22
    • 2023-03-15
    • 2013-06-10
    • 2013-03-16
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多