阅读内置的python模块[重复]
Posted
技术标签:
【中文标题】阅读内置的python模块[重复]【英文标题】:Reading the builtin python modules [duplicate] 【发布时间】:2012-12-02 23:50:54 【问题描述】:可能重复:How do I find the location of Python module sources?
我不明白如何阅读内置 python 模块中的代码。例如,我知道如何找出模块中的内容,
import os;
dir(os)
但是当我尝试寻找函数 listdir
时,我找不到 def listdir
来读取它的实际作用。
【问题讨论】:
最简单的选择是look it up in the docs。 @Lattyware:文档在哪里告诉您来源?一些模块确实有指向源代码的链接,通常是那些与可用代码一样多的示例(如asyncore
),但大多数没有(如os
)。
@abarnert 我认为“阅读它的实际作用”是指如何使用它,而不是查看源代码。这个问题有点不清楚,但重读一下,你的解释可能是对的。
@HansEngel:这个答案已经过时了。他们在 2.1 中添加了inspect
,因此您不必处理“有时有__file__
,有时没有,有时是.pyc
,有时是.py
,它可能会有所不同不同的平台,甚至在 PyPy 等不同的实现上更糟糕。”东西了,从 3.0 开始,甚至没有记录规则(除了“它必须是 inspect
期望的任何东西”)。
【参考方案1】:
一个字:inspect。
inspect 模块提供了几个有用的函数来帮助获取有关活动对象的信息,例如模块、类、方法、函数、回溯、框架对象和代码对象。例如,它可以帮助您检查类的内容、检索方法的源代码、提取和格式化函数的参数列表,或者获取显示详细回溯所需的所有信息。
它在标准库中,文档中有示例。所以,你只需要print(inspect.getsource(os))
,或者inspect.getsourcefile(os)
,等等。
请注意,一些标准库模块是用 C 编写的(或者甚至是内置在解释器中的假模块),在这种情况下,getsourcefile
什么也不返回,但getfile
至少会告诉你这是一个@987654329 @/.pyd
/whatever,您可以使用它来查找原始 C 源代码,例如 Python 源代码的副本。
您也可以只输入help(os)
,顶部右侧的FILE
会为您提供路径(通常与Python 模块的getsourcefile
相同,否则与getfile
相同)。
您可以随时访问Python modules 和C extension modules 的在线资源。只需将 URL 中的“2.7”更改为“3.3”等即可获得不同的版本。 (我相信如果你完全删除版本,你会得到主干代码,目前对应于 3.4 pre-alpha,但不要引用我的话。)
os.listdir
函数实际上并未直接在os
中定义;它实际上是 from <platform-specific-module> import *
导入的。您可以自己通过几个步骤来追踪它,但在大多数平台上,它通常是posixmodule.c
中的posix_listdir
。 (即使是 Windows——最近的版本也使用相同的文件来定义非 Windows 上的 posix
模块,以及 Windows 上的 nt
和 posix
模块,并且代码中有一堆 #if defined(…)
的东西。)
【讨论】:
以上是关于阅读内置的python模块[重复]的主要内容,如果未能解决你的问题,请参考以下文章