我在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
>>>
答案 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; - 除了那小部分序列操作之外什么都没有暴露出来。