05.12.19 21:25, Matthias Bussonnier пише:
I've been tripped up a couple of time by a few Exception names being lower case both in code and tracebacks. In particular `error` (all lower case) I tend to read `error` as a function instead of a class.
According to my non-scientific grep-foo, I find that ~ 300 descendant from Exceptions start with an upper case:
~/dev/cpython[master ✗] $ rg '^[ ]*class [A-Z][a-zA-Z]+\(' | grep Excep | wc -l 333 18 of those are `Error` uppercase: ~/dev/cpython[master ✗] $ rg '^[ ]*class Error\(' | wc -l 18 but 4 are lower case:
~/dev/cpython[master ✗] $ rg '^[ ]*class [a-z][a-zA-Z]+\(' | grep Exception Lib/sre_constants.py:class error(Exception): Lib/imaplib.py: class error(Exception): pass # Logical errors - debug required Doc/faq/design.rst: class label(Exception): pass # declare a label Lib/dbm/__init__.py:class error(Exception):
... there are probably others if they don't directly inherit from Exception of course.
There are few more lowercase exception names (all of them start with "error"): dbm/__init__.py:38:class error(Exception): ftplib.py:58:class error_reply(Error): pass # unexpected [123]xx reply ftplib.py:59:class error_temp(Error): pass # 4xx errors ftplib.py:60:class error_perm(Error): pass # 5xx errors ftplib.py:61:class error_proto(Error): pass # response does not begin with [1-5] imaplib.py:180: class error(Exception): pass # Logical errors - debug required poplib.py:31:class error_proto(Exception): pass sre_constants.py:23:class error(Exception): There are also several aliases: calendar.py:21:error = ValueError copy.py:57:error = Error # backward compatibility dbm/__init__.py:45:error = (error, OSError) dbm/dumb.py:33:error = OSError distutils/log.py:62:error = _global_log.error getopt.py:54:error = GetoptError # backward compatibility http/client.py:1470:error = HTTPException re.py:181:error = sre_compile.error test/mock_socket.py:151:error = socket_module.error zipfile.py:51:error = BadZipfile = BadZipFile # Pre-3.2 compatibility names