【问题标题】:python cffi library object introspection results in __dict__ object changepython cffi 库对象自省导致 __dict__ 对象更改
【发布时间】:2016-03-09 23:09:23
【问题描述】:

我想使用 cffi 从头文件中获取枚举的完整列表。但是我看到了一个奇怪的行为:通过观察对象,我正在强制改变底层__dict__

>>> from cffi import FFI
>>> ffi = FFI()
>>> ffi.cdef('typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;')
>>> c = ffi.dlopen('c')

# the dictionary is empty
>>> print c.__dict__
{}

>>> dir(c)

# the dictionary is populated
>>> print c.__dict__
{'SEARCH': 2, 'RANDOM': 0, 'IMMEDIATE': 1}

我猜__dict__ 在类上的第一个getattr() 被调用之前不会填充,但真正的问题是:dir() 填充__dict__ 是做什么的?调用hasattr() 似乎也能做同样的事情。

【问题讨论】:

    标签: python python-cffi


    【解决方案1】:

    从技术上讲,您观察到的原因是dir() 试图在lib 对象上获取一些特殊属性,例如__members__。 cffi 中的代码在计算属性时会延迟添加属性。如果没有找到作为函数的名称,它将继续安装所有枚举声明并尝试返回其中一个,如果这是我们尝试读取的名称。这就是为什么尝试读取一个不存在的名称总是会在lib.__dict__ 中安装所有枚举。 (此逻辑仅适用于ffi.dlopen()返回的库,不适用于API模式。)

    理想情况下,您不应该依赖任何这些,但在这种情况下,您必须:这确实是一个错误。请注意,您可以简单地阅读dir(lib) 两次:第二次,它将包含枚举值... (修复了 19cae8d1a5f6 中的错误:至少 dir(lib) 应该始终在 cffi 1.4 中工作——并且不再列出所有特殊的 Python 方法名称。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 2013-06-05
      • 2023-03-23
      • 1970-01-01
      • 2020-12-26
      • 2013-12-29
      • 2018-06-08
      相关资源
      最近更新 更多