出于某些愚蠢的原因,我最近需要构建None
。
我的第一次尝试是抓住None
的课程并使用它。
nt = type(None)
但是,调用nt
会出现此错误:
nt()
TypeError: cannot create 'NoneType' instances
这给了我一个轻笑,用以下方式取代了这个尝试:
nt = lambda: None
这让我想到为什么这不起作用。我知道解释器只有一个None
,但对于其他几个python对象也是如此,它们的构造函数不会这样。
此SO question讨论了None
及其类型的遗产,但据我所知,这并不能解释为什么type(None)()
会导致TypeError
{1}}。
我认为它必须与元类中__new__
的返回值发生的某些错误检查有关,但我不确定。
编辑:不是Value of Py_None的重复
该问题要求" CPython中Py_None对象的c级值是多少?"
这个问题具体是关于"为什么type(None)()
会产生运行时错误(TypeError
)"。 type(None)
为我们NoneType
提供了type
的实例。调用它会导致TypeError
,这很奇怪。正如@metatoaster指出的那样,这种行为特定于2.x.在3.x NoneType()
中将生成None
。这是我期望的行为,显然核心开发人员也认为这种变化也是如此。
@metatoaster还提供了一个看起来很有前途的来源link。这条线似乎可能产生运行时错误消息' TypeError:无法创建' NoneType'实例&#39 ;.我在cannot create .* instances
的cpython repo中对2.7.14标记进行了正则表达式搜索,这一行是唯一的结果。
这是消息的上下文:
static PyObject *
type_call(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject *obj;
if (type->tp_new == NULL) {
PyErr_Format(PyExc_TypeError,
"cannot create '%.100s' instances",
type->tp_name);
return NULL;
}
...
}
回购邮件中有一些地方将tp_new
设置为NULL
但其中没有任何地方与NoneType