python中所有的异常类都是谁的子类_返回OSError异常类的子类实例的逻辑在哪里?...

>>> 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可以生成用户定义类的实例,如果你问我为什么要这样做?我会说,只是为了好玩。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值