Python 分配到属性引用时发生TypeError?

Python 分配到属性引用时发生TypeError?,python,python-3.x,typeerror,attr,Python,Python 3.x,Typeerror,Attr,在阅读Python文档时,我发现: 如果目标是属性引用:将计算引用中的主表达式。它应该产生一个具有可分配属性的对象;如果不是这种情况,则引发TypeError。然后要求该对象将指定的对象指定给给定的属性;如果无法执行赋值,则会引发异常(通常但不一定是AttributeError) 我想知道如何得到这个TypeError 哪些Python类型没有设置属性的例程?如果要在代码中引发TypeError: raise TypeError 我建议您阅读Python中的异常和异常处理以了解更多信息 这个文

在阅读Python文档时,我发现:

如果目标是属性引用:将计算引用中的主表达式。它应该产生一个具有可分配属性的对象;如果不是这种情况,则引发
TypeError
。然后要求该对象将指定的对象指定给给定的属性;如果无法执行赋值,则会引发异常(通常但不一定是
AttributeError

我想知道如何得到这个
TypeError


哪些Python类型没有设置属性的例程?

如果要在代码中引发TypeError:

raise TypeError

我建议您阅读Python中的异常和异常处理以了解更多信息

这个文档行已经过时了。它至少可以追溯到类型/类统一之前很久。我相信那时,我正试图做一些

x = 1
x.foo = 3
可能会产生一个类型错误,但当时我没有编写Python,而且我没有足够古老的解释器版本来测试它

如果查看分配分派的属性,可以看到记录的检查仍然存在:

if (tp->tp_setattro != NULL) {
    ...
    return ...;
}
if (tp->tp_setattr != NULL) {
    ...
    return ...;
}
Py_DECREF(name);
assert(name->ob_refcnt >= 1);
if (tp->tp_getattr == NULL && tp->tp_getattro == NULL)
    PyErr_Format(PyExc_TypeError,
                 "'%.100s' object has no attributes "
                 "(%s .%U)",
                 tp->tp_name,
                 value==NULL ? "del" : "assign to",
                 name);
else
    PyErr_Format(PyExc_TypeError,
                 "'%.100s' object has only read-only attributes "
                 "(%s .%U)",
                 tp->tp_name,
                 value==NULL ? "del" : "assign to",
                 name);
return -1;
如果一个对象的类型没有设置属性的例程,Python会引发一个错误,根据该类型是否有获取属性的例程,抱怨“没有属性”或“只有只读属性”。我相信在早期,像
int
这样的类型会沿着这条代码路径前进。然而,所有类型现在都从
对象继承了这样的例程,所以我认为永远不会采用这种代码路径

中有一个相关的代码路径,它会引发一个
TypeError
,用于设置用C编写的类型的属性。此代码路径仍然被采用,但它不像文档中描述的那样通用:

if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
    PyErr_Format(
        PyExc_TypeError,
        "can't set attributes of built-in/extension type '%s'",
        type->tp_name);
    return -1;
}
>>> def f(): pass
...
>>> f.func_globals = 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: readonly attribute

此代码生成一个
TypeError
,似乎是文档所描述的:

if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
    PyErr_Format(
        PyExc_TypeError,
        "can't set attributes of built-in/extension type '%s'",
        type->tp_name);
    return -1;
}
>>> def f(): pass
...
>>> f.func_globals = 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: readonly attribute
更新(Python 3)

上面是在Python2.7中。在Python3中,没有
func_globals
,因此这不适用(您可以为其分配任何内容)

python3中的attributes函数在只读时似乎会引发一个
AttributeError

>>> f.__globals__ = 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: readonly attribute
>>f.\uuuuu全局=0
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:只读属性

这对我来说很有意义。就Python 3而言,文档的这一部分可能只是一个遗物。

我使用Python大约2年了,但从未遇到过这种情况。对于
f.func\u globals
,它不会引起错误。我使用Python3.5.2。您提示我一个答案
对象。一些属性会引发TypeError:)我认为如果您显式删除
\uuuuuuuusetattr\uuuuuuuu
,仍然可能发生这种情况。不过我没有测试它。@Kritzefitz不,不,如果你不能分配,你不能
del
!我稍微修改了我的问题,因为你真的向我透露了我的问题。