我想开始阅读Python源代码。我应该从哪里开始[关闭]


78

我想开始阅读Python源代码。

我的经验,

我非常了解Python和Java。我知道其他各种水平的语言,但是C / C + /都不是很好。我在大学里学习过C,但是从来没有对它进行过专业编程。

我阅读此代码的原因。

  1. 了解python的工作原理。
  2. 更好地学习C。

1对我来说比2更重要。

我该怎么办?


8
好问题!我不能帮忙,因为我还没有做,但是我会特别注意以下答复的:)
AntonioMO

3
可怕的问题!我不明白为什么您还没有开始阅读Python源代码。您是否需要指向源的链接?问题是什么?
S.Lott

6
例如:如果有人问我应该如何阅读Django项目,我的答案将是..从urls.py开始,看看应用程序/项目响应的URL。接下来查看模型,以了解问题域。现在来看与每个URL对应的视图...我想要一个类似的结构答案。
agiliq

@uswaretech:请不要对您自己的问题发表评论。您拥有这个问题。请修正它,以说出您真正想知道的内容。从书面上来说,您的问题是难以理解的。请更新问题,而不要添加评论。
S.Lott

6
为什么关闭这么好的问题?
尼尔

Answers:


45

首先了解Python C API。它是一个庞大而丰富的API,Python源代码自然会在各处使用它。在您必须了解Py_INCREF等的含义之前,您不会对Python源代码有太多了解。

我在Pycon上做了一个演讲,解释了API:您可能会发现有用的通过Python C扩展进行的旋风游览。C扩展使用与Python代码本身相同的API。


2
C API的+1:有很多向Python添加电池的机会,这并不好笑。
杰德·史密斯,

1
精彩的演讲,内容丰富。
mjgpy3 2012年

您提供的链接非常有用。谢谢。
尼尔

22

首先,如果您对1最感兴趣,那么我将从阅读各种模块的Python源代码开始(而不是直接跳转到C)。每当我发现自己阅读某些模块的源代码时,就总是学到关于Python编程的新知识。

其次,如果您想更好地学习C,我个人会建议完全不同的东西:在其中编程。仅仅静态地阅读源代码并不能使您更好地理解C(至少,这是一种有限的方法;它可能会使您变得更好一些,但阅读源可以让您受益匪浅)。

在使用C编写了至少一个中等大小的项目之后,我将开始研究Python源代码。那确实是更好地了解C的唯一方法,而且我真的认为,不了解C的情况下阅读Python的C源代码不会使您走得太远。

一个C项目的想法

实际上,这是一个C项目的想法:用C编写Python解释器。显然,它甚至还差一点就完成,这是一个相当艰巨的项目,但是如果您只专注于语言的某些部分,我认为这是一个好主意。

它不仅将帮助你学习C,它会帮助你好多了,甚至理解的Python之前查看源:你必须有一个更深的了解很多在Python中的东西,你就会明白在设计权衡Python的工作方式等

然后,当您最终阅读Python的代码时,您不仅会理解为什么某些事情会以这种方式起作用,而且您可能会学到很多非常酷的C技术来解决您遇到的问题。


15

1)首先确保您可以构建自己的Python并将其运行到调试器中。因此,您不仅可以添加打印表达式,还可以断点并遵循代码流。如果您拥有可让您跟踪函数调用的工具,那就太好了,您将需要它。

2)从实现数据类型的文件开始。它们非常容易理解,您在阅读代码时可以提高C语言的技能。

3)制作UML图-Argo UML或MS Visio等简单的绘图帮助工具可以在这里为您提供帮助。写下代码流。

4)阅读python的启动代码。查看什么以及如何初始化基本基础结构。

6)是100%理解Python的一面-甚至更难的实现细节,什么是AST,什么是绑定方法和未绑定方法以及如何实现它们。当您想到一个模型时,如何编写python解释器,则可以转到最后的主步骤。

7)使用提供的快速调试器C API编写调试器扩展。这可以帮助您提高C语言技能。

8)采取最后的掌握步骤,并深入了解解释器代码的核心。对于一个熟练的C程序员来说,这甚至很难阅读和理解。了解表达式的求值方式和方法查找的缓存方式,框架的作用域规则设置等。这既困难又复杂-就复杂性和代码行而言。

9)启动Adobe Photoshop并创建一个外观漂亮的“ Python大师”文凭,并将其放在您的办公室墙上。


2
您能告诉我如何将其运行到调试器中吗?
satoru 2014年

12

从Python网站下载源代码。假设您将源代码解压缩到名为Python-3.1.1的目录中。我建议您在Python源代码中提供两个起点,以帮助您探索Python的工作原理:

  • 检查Python虚拟机如何执行从插入器生成的字节码。Python VM位于名为Python-3.1.1 / Python / ceval.c的文件中。VM的核心是一个eval循环,该循环从ceval.c中的函数PyEval_EvalFrameEx开始。通读源代码和内联注释。我相信你会喜欢的。

  • 另一个选择是查看如何实现内置的python数据类型(如列表,字典和集合)。例如,实例集是在Python-3.1.1 / Objects / setobject.c中实现的。对象目录也包含其他数据类型的实现。


1
任何信息都是有用的信息。谢谢,您能给我更多的指示开始吗?
尼尔,

5

这个问题范围很广,所以我想最好的答案就是下载python源代码并发疯。选择一个您熟悉的python模块或部分,并检查其底层内容。


2
+
1-

我对原始问题添加了评论,这将帮助我“发疯”
。– agiliq

您将自己的情况与想要进入django来源的人进行比较,然后指出应该从“ urls.py”开始。为什么?因为它最重要?我不同意,我认为您应该从一个您非常熟悉的模块开始,以便更好地得出有关幕后算法产生什么结果(以及如何)的结论。
Mizipzor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.