- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我很清楚None
用于表示缺少值。但是由于在实现过程中一切都必须有一个潜在的值(value),我想看看使用了什么值(value)来表示没有值(value),关于 CPython
.
我明白了,基于 documentation , 那NoneObject
是单例。自从我的 c
技能生锈了,我最好的业余猜测是 None
的值将是指向为 Py_None
分配的内存的指针目的;因为它是一个单例,所以这将保证唯一性。还是分配给c
的 NULL
其值为 0x0000
基于 this question 中的第二个答案?
此外,文档还指出:
Note that the PyTypeObject for None is not directly exposed in the Python/C API.
我猜这意味着您无法通过源代码搜索找到它。 (我这样做了,不知道去哪里找,因为 object.c
天真地相信我能理解任何东西)
但我不确定我对此的看法,所以我问了。
什么是 c
Py_None
的级别值CPython
中的对象?
最佳答案
Py_None
是Include/object.h
中的宏定义。它是 object.c
中 _Py_NoneStruct
的别名,它是 PyObject
类型的静态(如在存储中)全局变量(这是一个结构)。它在 Python 术语中被指定为 NoneType
(在 object.c
中定义在它的正上方,并且仅在 _Py_NoneStruct
中使用一次)。
所以它不是 NULL 或 C 中的任何其他特殊值,它是 _PyNone_Type
的单例 PyObject
实例。至于 _PyNone_Type
PyTypeObject
没有被公开,我想他们指的是 static
关键字(即内部链接),这意味着 PyTypeObject
只能在 object.c
中访问,并且只在 PyNone
的定义中使用一次。
只是补充一点,每当文档说 PyNone
没有类型时,它不应该按字面意思理解。它有一种特殊的类型,NoneType
,您仍然可以通过 None
单例访问它,但您不能创建新实例或做任何其他您可以做的事情一个正常的类型。对于不创建新实例似乎存在硬编码限制,虽然我无法在 CPython 源代码中找到它的确切定义位置,但您可以在尝试创建新实例时看到它的效果:
>>> type(None)
<type 'NoneType'>
>>> type(None)()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot create 'NoneType' instances
编辑:当 tp_new
字段为 NULL 时,似乎从 typeobject.c
中抛出错误。令人惊讶的是,尽管 _PyNone_Type
似乎是用非 NULL tp_new
定义的(指向 object.c
中的静态 none_new
>).它可能会在某个时候设置为 NULL,但这只是一个实现细节,并不会真正影响您的问题范围。
关于python - Py_None 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33121048/
为什么在 C 中返回 Py_None 之前需要 Py_INCREF(Py_None),如下所示? Py_INCREF(Py_None); return Py_None; 如果省略 Py_INCREF(
我很清楚None用于表示缺少值。但是由于在实现过程中一切都必须有一个潜在的值(value),我想看看使用了什么值(value)来表示没有值(value),关于 CPython . 我明白了,基于 do
我正在为 Python 包装一个 Go 库。我需要能够返回 None,但它在编译时找不到它: /* #cgo pkg-config: python3 #define Py_LIMITED_API #i
我是一名优秀的程序员,十分优秀!