在查看系统库socket.py
实现时,我遇到了这段代码
try:
import errno
except ImportError:
errno = None
EBADF = getattr(errno, 'EBADF', 9)
EINTR = getattr(errno, 'EINTR', 4)
这段代码只是一个过去时代的遗物,还是有没有errno
模块的平台/实现?
为了更明确,import errno
没有异常处理程序是否安全?
我对python 2.x和3.x的答案感兴趣。
修改
澄清问题:我必须测试在IOError
模块中引发的socket
例外中编码的错误代码。上面的代码位于cpython code base中,让我对socket
可用的已知情况感到怀疑,但import errno
会失败。也许是一个小问题,但我想避免不必要的代码。
答案 0 :(得分:1)
好吧,可能会出现errno可能无法使用的情况。我之前没有检查它,但是对于在非Unix系统上运行的python实现,例如windows,symbian ......以及在模拟器中运行的python实现(比如基于Javascript的python REPL)。
但是,如果您没有提供使用errno的替代方案,并且实际上是为其他系统使用套接字,我会说您可以安全地保持导入失败,因为您的代码赢了& #39;无法使用。您可能只想抓住它以抛出更明确的消息。
答案 1 :(得分:1)
errno
可用。 ENOENT
等名称的可用性可能取决于平台:errno module source中有大量的ifdef
s。在"errno.h"
中检查了./configure
标头,因此它可能无处可用(似乎在WinCE上没有使用),但它不应该阻止import errno
。
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)
我之前可以理解状态:from errno import EBADF
可能会引发ImportError
,因为EBADF
可能在系统上不可用。国家之后,我不明白。我认为import errno
在任何平台上都应该在CPython上取得成功。