在查看系统库socket.py实现时,我遇到了这段代码
try:
import errno
except ImportError:
errno = None
EBADF = getattr(errno, 'EBADF', 9)
EINTR = getattr(errno, 'EINTR', 4)
这段代码只是过去时代的遗留物,还是有没有errno模块的平台/实现?
为了更明确,在没有异常处理程序的情况下导入errno是否安全?
我对python 2.x和3.x的答案感兴趣.
编辑
澄清问题:我必须测试在套接字模块内引发的IOError异常中编码的错误代码.上面的代码在cpython code base中,让我对可用套接字的已知情况感到怀疑,但import errno会失败.也许是一个小问题,但我想避免不必要的代码.
最佳答案 errno自Python 1.4起可用. ENOENT等名称的可用性可能取决于平台:
errno module source中有大量的ifdef.“.errno.h”标题在./configure中检查,因此它可能无法在任何地方使用(似乎它没有用于WinCE)但它不应该阻止导入错误.
Here’s the initial revision that introduces errno=None
:
try:
- from errno import EBADF
+ import errno
except ImportError:
- EBADF = 9
+ errno = None
+EBADF = getattr(errno, 'EBADF', 9)
+EINTR = getattr(errno, 'EINTR', 4)
我之前可以理解状态:从errno导入EBADF可能引发ImportError,因为EBADF可能在系统上不可用.国家之后,我不明白.我认为在任何平台上,导入errno应该总是在CPython上成功.