Py_None的值

时间:2015-10-14 09:04:35

标签: python c cpython

我很清楚,None用于表示缺乏价值。但由于在实施过程中所有内容都必须具有潜在价值,因此我希望看到使用了什么值来表示缺少值CPython

据我所知,基于documentationNoneObject是单身人士。由于我的c技能是生锈的,我最好的业余猜测是,None的值将是指向为Py_None对象分配的内存的指针;因为它是单身,这将保证唯一性。或者根据this question中的第二个答案将其分配给c的{​​{1}},其值为NULL

此外,文档还指出:

  

请注意,PyTypeObject for None不会直接在Python / C API中公开。

我猜这意味着你找不到它通过源搜索。 (我做了,不知道在哪里看,object.c天真地相信我能理解任何东西)

但我不确定我对此的看法所以我问过。

0x0000c对象的Py_None级别值是多少?

3 个答案:

答案 0 :(得分:5)

Py_NoneInclude/object.h中的宏定义。它是_Py_NoneStructobject.c的别名,它是PyObject类型的静态(如存储中)全局变量(它是一个结构)。它在Python术语中分配为NoneType(在object.c上方定义,并且仅用于_Py_NoneStruct)。

因此它不是NULL或C中的任何其他特殊值,它是PyObject的单个_PyNone_Type实例。至于_PyNone_Type PyTypeObject未公开,我认为它们引用static关键字(即内部链接),这意味着PyTypeObject只能在{{1}内访问并且仅用于object.c的定义。

只是添加一点,只要文档说PyNone没有类型,就不应该按字面意思理解。它有一种特殊的类型PyNone,您仍然可以通过NoneType单例访问它,但是您无法创建新实例或使用普通类型执行任何其他操作。似乎没有创建新实例的硬编码限制,虽然我无法准确找到它在CPython源中定义的位置,但在尝试创建新实例时可以看到它的效果:

None

编辑:当>>> type(None) <type 'NoneType'> >>> type(None)() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot create 'NoneType' instances 字段为NULL时,似乎从typeobject.c抛出错误。令人惊讶的是,tp_new似乎是使用非NULL _PyNone_Type定义的(指向tp_new中的静态none_new)。之后可能会在某个时刻将其设置为NULL,但它只是一个实现细节,并不会对您的问题范围产生任何影响。

答案 1 :(得分:1)

Py_NonePy_None,如果不返回其他值,则必须在正常操作期间从函数中递增并返回。只有在要向VM发出异常信号并使用实际异常对象created/assigned separately时才会返回NULL

答案 2 :(得分:1)

>>> import re >>> def htmlUnescape(m): ... return unichr(int(m.group(1), 16)) ... >>> re.sub('&#([^;]+);', htmlUnescape, "This is something &#8217; with an HTML-escaped character in it.") u'This is something \u8217 with an HTML-escaped character in it.' >>> Py_None结构定义的地址值。

请参阅the code

_Py_NoneStruct