C语言 python是如何从静态类型语言中实现类型自由变量的



我知道大多数python都是用C实现的。我想知道 python 如何在引擎盖下工作(就其在 C 中的实现而言(,在这种情况下确定它是什么类型的变量,让我们说现在x = 5如果检查 x 的类型它会说类 int,但它是如何在 C 中实现的? 在引擎盖下进行哪些检查以确定它属于 int 类

Python绝不是"无类型"的(参见"Python 是强类型吗?"(。 所有 Python 对象都有一个特定的类型,用于确定它们的许多属性和行为。 对于表示为文字的用户,该类型由其词汇形式决定。 对于其他对象,它由它们的计算方式决定。

Python 没有的是类型声明或任何其他内置形式来限制或预先确定变量或聚合可能包含的对象类型。 因此,谈论变量的类型(例如您的x(是没有意义的,而只谈论它所包含的值的类型。 这就是type()函数(例如(的计算结果。 所以当你问

python在确定它是什么类型的变量时如何在引擎盖下工作(就其在C中的实现而言(

答案在某种意义上很简单:Python根本不会这样做。变量没有类型——只有它们的值有类型。 当你调用,比如说,type(x),你不是在确定变量的类型,而是在确定其当前值的类型。

Python 通过确保每个 Python 对象(例如由文字5表示的对象(都包含相当多的数据来支持这一点。 值得注意的是,它包含有关对象值和类型的信息,但也包含各种其他详细信息,例如引用计数等等。 细节对于SO答案来说太宽泛了,但是您可以在Python/C API参考手册中找到很多细节。 对于最深和最亲密的秘密,你会想要研究cpython头和源代码。

这是一个巨大的主题。

下面的文档会让你有更多的了解。

https://intopythoncom.files.wordpress.com/2017/04/internalsofcpython3-6-1.pdf

就像你说的整数类型的简单例子

为了保存整数类型对象,在 C 中定义了结构,如下所述

typedef struct {
PyObject_HEAD
long ob_ival;
} PyIntObject;

C结构PyIntObject的对象(上述文档的第7.5节(包含整数类型的对象。

如果您更感兴趣,请按照上述文档的同一第 7.5 节中所述设置环境和调试。

Objects/intobject.c 并将调试点放在第 89 行。开始 调试应用程序。

对于要表示的类型,PyTypeObject处于更高级别。(请参阅上述文件第7.3节(

作为一名程序员,了解内部结构是很奇怪的方面。但不要花太多时间去理解,除非你在口译员级别工作。

最新更新