Python:将errno映射到OSError的子类

Python:将errno映射到OSError的子类,python,subclass,errno,oserror,Python,Subclass,Errno,Oserror,我有一个调用C函数的Python 3程序。C函数在成功时返回一个整数:0,或在失败时返回相应的errno。失败时,Python代码可以简单地引发OSError。但我更希望它提出OSError的适当子类 例如,如果Python程序得到返回代码2,它应该引发FileNotFoundError,这是OSError的子类。通过执行以下三个步骤,我已经可以找到正确的子类。显然,性能不是问题,因为对于errno的所有值,我只需要在每个版本的Python 3中执行一次这些步骤,并缓存结果 查找OSError的

我有一个调用C函数的Python 3程序。C函数在成功时返回一个整数:0,或在失败时返回相应的
errno
。失败时,Python代码可以简单地引发
OSError
。但我更希望它提出
OSError
的适当子类

例如,如果Python程序得到返回代码2,它应该引发
FileNotFoundError
,这是
OSError
的子类。通过执行以下三个步骤,我已经可以找到正确的子类。显然,性能不是问题,因为对于
errno
的所有值,我只需要在每个版本的Python 3中执行一次这些步骤,并缓存结果

  • 查找
    OSError
    的所有子类。这很容易使用
    \uuuu子类\uuuu
    ,必要时可以递归使用
  • 将所有
    errno
    值映射到名称。例如,如果
    errno
    为2,则应映射到
    enoint
    。这是通过解析适当的C include文件来完成的。例如,在FreeBSD上,该文件将是
    /usr/include/errno.h
  • errno
    名称映射到
    OSError
    子类。这可以通过解析中的HTML代码来实现,例如

  • 但第三步真的是非常非常笨拙。有没有一种方法可以在不解析文档的情况下执行该步骤?在我的本地主机上的Python中是否有我可以检查的东西?

    当您查看文档时,我相信这种翻译是自动完成的。例如,如果您拨打:

    raise OSError(2, 'this went wrong') # here the 2 corresponds to the error given by C
    # raises -> FileNotFoundError: [Errno 2] this went wrong
    

    有关此处使用的精确映射,请转到“您参考”并查看“操作系统异常”部分。

    您的想法是正确的,我简直不敢相信我竟然没有先尝试过!有趣的是,它只在包含第二个参数字符串时使用子类;字符串可能为空。