我如何使用内省来让Python告诉我更多有关PIL ImagingCore对象的信息?

时间:2015-02-21 21:24:47

标签: python python-imaging-library introspection

我在PIL做的事情正在给我一个我不认识的课程的对象。它可能是围绕C数据结构或其他东西的相当薄的包装器。我怎样才能让Python告诉我在哪里寻找更多信息?

以下是使用内省学习更多内容的失败尝试:

>>> import os, PIL
>>> obj = PIL.Image.open(os.path.expanduser("~/Desktop/foo.png")).getdata()
>>> type(obj)
<type 'ImagingCore'>
>>> ImagingCore
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'ImagingCore' is not defined
>>> PIL.ImagingCore
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'ImagingCore'
>>> obj.__class__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: __class__
>>> obj.__module__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: __module__
>>> import inspect
>>> inspect.getsource(obj)
...
TypeError: <ImagingCore object at 0x105e64b50> is not a module, class, method, function, traceback, frame, or code object
>>> inspect.getsource(type(obj))
...TypeError: <module '__builtin__' (built-in)> is a built-in class
>>>

1 个答案:

答案 0 :(得分:1)

PIL的核心功能在模块_imaging中实现,正如您所猜测的那样,用C语言编写 - 请参阅顶部的_imaging.c(3281行......: - )级别源目录,Imaging-1.1.7。该代码并没有注意内省 - 相反,它100%专注于性能。我相信除了函数之外,它甚至不会暴露任何东西(它确实实现了几种类型,包括ImagingCore,但它们甚至不会将这些类型的名称暴露给Python - 只在内部生成和使用它们)

所以Python不会告诉你在哪里寻找更多信息,因为库反过来会告诉Python :-)。正如http://effbot.org/imagingbook/image.htm getdata处的文档所说:

  

请注意,此方法返回的序列对象是内部的   PIL数据类型,仅支持某些序列操作,   包括迭代和基本序列访问。将其转换为   普通序列(例如用于打印),请使用list(im.getdata())

...和&#34;她写的所有内容&#34; - 除了那小部分序列操作之外什么都没有暴露出来。