>>> OSError(2, os.strerror(2))
FileNotFoundError(2, 'No such file or directory')
>>> OSError(2, os.strerror(2)).errno
2
>>> OSError(2, os.strerror(2)).strerror
'No such file or directory'
如您所见,将errno和strerror传递给OSError的构造函数,返回FileNotFoundError实例,它是OSError的子类。在
Python文档:The constructor often actually returns a subclass of OSError, as described in OS exceptions below. The particular subclass depends on the final errno value. This behaviour only occurs when constructing OSError directly or via an alias, and is not inherited when subclassing.
我想编写一个这样的子类。主要是好奇,而不是真实世界的代码。我还想知道,创建子类对象的逻辑在哪里,例如它是用__new__编码的吗?如果__new__包含创建子类实例的逻辑,那么从OSError继承通常会返回此行为,除非__new__中有某种类型的类型检查:
^{pr2}$
必须进行类型检查,然后:# If passed OSError, returns subclass instance
>>> A.__new__(OSError, 2, os.strerror(2))
FileNotFoundError(2, 'No such file or directory')
# Not OSError? Return instance of A
>>> A.__new__(A, 2, os.strerror(2)
A(2, 'No such file or directory')
我一直在研究C代码,以找出这些代码的确切位置,由于我不是C方面的专家,我怀疑这确实是逻辑问题(坦率地说,我对此持怀疑态度):if (myerrno && PyLong_Check(myerrno) &&
errnomap && (PyObject *) type == PyExc_OSError) {
PyObject *newtype;
newtype = PyDict_GetItem(errnomap, myerrno);
if (newtype) {
assert(PyType_Check(newtype));
type = (PyTypeObject *) newtype;
}
else if (PyErr_Occurred())
goto error;
}
}
现在我想知道在不使用C代码的情况下从Python本身扩展errnomap的可能性,这样OSErro可以生成用户定义类的实例,如果你问我为什么要这样做?我会说,只是为了好玩。在