我很清楚,None
用于表示缺乏价值。但由于在实施过程中所有内容都必须具有潜在价值,因此我希望看到使用了什么值来表示缺少值CPython
。
据我所知,基于documentation,NoneObject
是单身人士。由于我的c
技能是生锈的,我最好的业余猜测是,None
的值将是指向为Py_None
对象分配的内存的指针;因为它是单身,这将保证唯一性。或者根据this question中的第二个答案将其分配给c
的{{1}},其值为NULL
?
此外,文档还指出:
请注意,PyTypeObject for None不会直接在Python / C API中公开。
我猜这意味着你找不到它通过源搜索。 (我做了,不知道在哪里看,object.c
天真地相信我能理解任何东西)
但我不确定我对此的看法所以我问过。
0x0000
中c
对象的Py_None
级别值是多少?
答案 0 :(得分:5)
Py_None
是Include/object.h
中的宏定义。它是_Py_NoneStruct
中object.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_None
为Py_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 ’ 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