Bei der Implementierung einer benutzerdefinierten Ausnahme für mein Modul war ich daran interessiert, wie sich die Baumstruktur der integrierten Ausnahmen zwischen Python 2 und 3 unterscheidet. Deshalb habe ich mich entschlossen, den Unterschied in der Baumstruktur jeder Version zu untersuchen.
Zusammenfassend wurde festgestellt, dass "die Baumstruktur von Ausnahmen je nach Version auch im 3. System sehr unterschiedlich ist, nicht in erster Linie die Unterscheidung zwischen dem 2. System und dem 3. System". Bitte beachten Sie, dass unerwartete Probleme auftreten können, wenn Sie der Meinung sind, dass die Baumstruktur der Ausnahmen in 3 Serien dieselbe ist.
print_exc_tree.py
#!/usr/bin/env python
from __future__ import print_function
import platform
def classtree(cls, depth=0):
if depth == 0:
prefix = ''
else:
prefix = '.' * (depth * 3) + ' '
if cls.__name__.lower() == 'error':
print('{0}{1} ({2})'.format(prefix, cls.__name__, cls))
else:
print('{0}{1}'.format(prefix, cls.__name__))
for subcls in sorted(cls.__subclasses__(), key=lambda c: c.__name__):
classtree(subcls, depth+1)
if __name__ == '__main__':
print('Python Version: {0}'.format(platform.python_version()))
print()
classtree(BaseException)
2.7.12 V.S. 3.5.2
Vergleichen Sie die letzten beiden zum Zeitpunkt des Schreibens. Grundsätzlich sollte es in Ordnung sein, wenn Sie diesen Unterschied in der Baumstruktur kennen.
$ pyenv shell 2.7.12
$ python print_exc_tree.py
Python Version: 2.7.12
BaseException
... Exception
...... Error (<class 'locale.Error'>)
...... StandardError
......... ArithmeticError
............ FloatingPointError
............ OverflowError
............ ZeroDivisionError
......... AssertionError
......... AttributeError
......... BufferError
......... EOFError
......... EnvironmentError
............ IOError
............... ItimerError
............ OSError
......... ImportError
............ ZipImportError
......... LookupError
............ CodecRegistryError
............ IndexError
............ KeyError
......... MemoryError
......... NameError
............ UnboundLocalError
......... ReferenceError
......... RuntimeError
............ NotImplementedError
......... SyntaxError
............ IndentationError
............... TabError
......... SystemError
............ CodecRegistryError
......... TypeError
......... ValueError
............ UnicodeError
............... UnicodeDecodeError
............... UnicodeEncodeError
............... UnicodeTranslateError
...... StopIteration
...... Warning
......... BytesWarning
......... DeprecationWarning
......... FutureWarning
......... ImportWarning
......... PendingDeprecationWarning
......... RuntimeWarning
......... SyntaxWarning
......... UnicodeWarning
......... UserWarning
...... _OptionError
...... error (<class 'sre_constants.error'>)
... GeneratorExit
... KeyboardInterrupt
... SystemExit
$ pyenv shell 3.5.2
$ python print_exc_tree.py
Python Version: 3.5.2
BaseException
... Exception
...... ArithmeticError
......... FloatingPointError
......... OverflowError
......... ZeroDivisionError
...... AssertionError
...... AttributeError
...... BufferError
...... EOFError
...... Error (<class 'locale.Error'>)
...... ImportError
......... ZipImportError
...... LookupError
......... CodecRegistryError
......... IndexError
......... KeyError
...... MemoryError
...... NameError
......... UnboundLocalError
...... OSError
......... BlockingIOError
......... ChildProcessError
......... ConnectionError
............ BrokenPipeError
............ ConnectionAbortedError
............ ConnectionRefusedError
............ ConnectionResetError
......... FileExistsError
......... FileNotFoundError
......... InterruptedError
......... IsADirectoryError
......... ItimerError
......... NotADirectoryError
......... PermissionError
......... ProcessLookupError
......... TimeoutError
......... UnsupportedOperation
...... ReferenceError
...... RuntimeError
......... BrokenBarrierError
......... NotImplementedError
......... RecursionError
......... _DeadlockError
...... StopAsyncIteration
...... StopIteration
...... StopTokenizing
...... SubprocessError
......... CalledProcessError
......... TimeoutExpired
...... SyntaxError
......... IndentationError
............ TabError
...... SystemError
......... CodecRegistryError
...... TokenError
...... TypeError
...... ValueError
......... UnicodeError
............ UnicodeDecodeError
............ UnicodeEncodeError
............ UnicodeTranslateError
......... UnsupportedOperation
...... Warning
......... BytesWarning
......... DeprecationWarning
......... FutureWarning
......... ImportWarning
......... PendingDeprecationWarning
......... ResourceWarning
......... RuntimeWarning
......... SyntaxWarning
......... UnicodeWarning
......... UserWarning
...... _OptionError
...... error (<class 'sre_constants.error'>)
... GeneratorExit
... KeyboardInterrupt
... SystemExit
Ich mache mir ein wenig Sorgen um sre_constants.error
, aber dies scheint verwendet zu werden, wenn der reguläre Ausdruck mehrdeutig ist (Referenz).
Python 3.5.2 (default, Jul 29 2016, 11:13:25)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> re.compile("*kittens*")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/dmiyakawa/.pyenv/versions/3.5.2/lib/python3.5/re.py", line 224, in compile
return _compile(pattern, flags)
File "/Users/dmiyakawa/.pyenv/versions/3.5.2/lib/python3.5/re.py", line 293, in _compile
p = sre_compile.compile(pattern, flags)
File "/Users/dmiyakawa/.pyenv/versions/3.5.2/lib/python3.5/sre_compile.py", line 536, in compile
p = sre_parse.parse(p, flags)
File "/Users/dmiyakawa/.pyenv/versions/3.5.2/lib/python3.5/sre_parse.py", line 829, in parse
p = _parse_sub(source, pattern, 0)
File "/Users/dmiyakawa/.pyenv/versions/3.5.2/lib/python3.5/sre_parse.py", line 437, in _parse_sub
itemsappend(_parse(source, state))
File "/Users/dmiyakawa/.pyenv/versions/3.5.2/lib/python3.5/sre_parse.py", line 638, in _parse
source.tell() - here + len(this))
sre_constants.error: nothing to repeat at position 0
Wenn Sie nachforschen, können Sie feststellen, dass sich diese Baumstruktur je nach Version auch im 3. System erheblich geändert hat. Es mag etwas redundant erscheinen, aber schauen wir uns nacheinander 3.0, 3.1, 3.2, 3.3, 3.4 an.
$ pyenv shell 3.0.1
$ python print_exc_tree.py
Python Version: 3.0.1
BaseException
... Exception
...... ArithmeticError
......... FloatingPointError
......... OverflowError
......... ZeroDivisionError
...... AssertionError
...... AttributeError
...... BufferError
...... EOFError
...... EnvironmentError
......... IOError
............ BlockingIOError
............ ItimerError
............ UnsupportedOperation
......... OSError
...... ImportError
......... ZipImportError
...... LookupError
......... CodecRegistryError
......... IndexError
......... KeyError
...... MemoryError
...... NameError
......... UnboundLocalError
...... ReferenceError
...... RuntimeError
......... NotImplementedError
...... StopIteration
...... SyntaxError
......... IndentationError
............ TabError
...... SystemError
......... CodecRegistryError
...... TypeError
...... ValueError
......... UnicodeError
............ UnicodeDecodeError
............ UnicodeEncodeError
............ UnicodeTranslateError
......... UnsupportedOperation
...... Warning
......... BytesWarning
......... DeprecationWarning
......... FutureWarning
......... ImportWarning
......... PendingDeprecationWarning
......... RuntimeWarning
......... SyntaxWarning
......... UnicodeWarning
......... UserWarning
...... error (<class '_thread.error'>)
...... error (<class 'sre_constants.error'>)
... GeneratorExit
... KeyboardInterrupt
... SystemExit
$ pyenv shell 3.1.5
$ python print_exc_tree.py
Python Version: 3.1.5
BaseException
... Exception
...... ArithmeticError
......... FloatingPointError
......... OverflowError
......... ZeroDivisionError
...... AssertionError
...... AttributeError
...... BufferError
...... EOFError
...... EnvironmentError
......... IOError
............ BlockingIOError
............ ItimerError
............ UnsupportedOperation
......... OSError
...... Error (<class 'locale.Error'>)
...... ImportError
......... ZipImportError
...... LookupError
......... CodecRegistryError
......... IndexError
......... KeyError
...... MemoryError
...... NameError
......... UnboundLocalError
...... ReferenceError
...... RuntimeError
......... NotImplementedError
...... StopIteration
...... StopTokenizing
...... SyntaxError
......... IndentationError
............ TabError
...... SystemError
......... CodecRegistryError
...... TokenError
...... TypeError
...... ValueError
......... UnicodeError
............ UnicodeDecodeError
............ UnicodeEncodeError
............ UnicodeTranslateError
......... UnsupportedOperation
...... Warning
......... BytesWarning
......... DeprecationWarning
......... FutureWarning
......... ImportWarning
......... PendingDeprecationWarning
......... RuntimeWarning
......... SyntaxWarning
......... UnicodeWarning
......... UserWarning
...... error (<class 'sre_constants.error'>)
... GeneratorExit
... KeyboardInterrupt
... SystemExit
$ pyenv shell 3.2.6
$ python print_exc_tree.py
Python Version: 3.2.6
BaseException
... Exception
...... ArithmeticError
......... FloatingPointError
......... OverflowError
......... ZeroDivisionError
...... AssertionError
...... AttributeError
...... BufferError
...... CalledProcessError
...... EOFError
...... EnvironmentError
......... IOError
............ BlockingIOError
............ ItimerError
............ UnsupportedOperation
......... OSError
...... Error (<class 'locale.Error'>)
...... ImportError
......... ZipImportError
...... LookupError
......... CodecRegistryError
......... IndexError
......... KeyError
...... MemoryError
...... NameError
......... UnboundLocalError
...... PickleError
......... PicklingError
......... UnpicklingError
...... PickleError
......... PicklingError
......... UnpicklingError
...... ReferenceError
...... RuntimeError
......... NotImplementedError
...... StopIteration
...... StopTokenizing
...... SyntaxError
......... IndentationError
............ TabError
...... SystemError
......... CodecRegistryError
...... TokenError
...... TypeError
...... ValueError
......... UnicodeError
............ UnicodeDecodeError
............ UnicodeEncodeError
............ UnicodeTranslateError
......... UnsupportedOperation
...... Warning
......... BytesWarning
......... DeprecationWarning
......... FutureWarning
......... ImportWarning
......... PendingDeprecationWarning
......... ResourceWarning
......... RuntimeWarning
......... SyntaxWarning
......... UnicodeWarning
......... UserWarning
...... _OptionError
...... _Stop
...... error (<class 'sre_constants.error'>)
...... error (<class '_thread.error'>)
...... error (<class 'select.error'>)
...... error (<class 'struct.error'>)
... GeneratorExit
... KeyboardInterrupt
... SystemExit
$ pyenv shell 3.3.6
$ python print_exc_tree.py
Python Version: 3.3.6
BaseException
... Exception
...... ArithmeticError
......... FloatingPointError
......... OverflowError
......... ZeroDivisionError
...... AssertionError
...... AttributeError
...... BufferError
...... EOFError
...... Error (<class 'locale.Error'>)
...... ImportError
......... ZipImportError
...... LookupError
......... CodecRegistryError
......... IndexError
......... KeyError
...... MemoryError
...... NameError
......... UnboundLocalError
...... OSError
......... BlockingIOError
......... ChildProcessError
......... ConnectionError
............ BrokenPipeError
............ ConnectionAbortedError
............ ConnectionRefusedError
............ ConnectionResetError
......... FileExistsError
......... FileNotFoundError
......... InterruptedError
......... IsADirectoryError
......... ItimerError
......... NotADirectoryError
......... PermissionError
......... ProcessLookupError
......... TimeoutError
......... UnsupportedOperation
...... ReferenceError
...... RuntimeError
......... NotImplementedError
......... _DeadlockError
...... StopIteration
...... StopTokenizing
...... SubprocessError
......... CalledProcessError
......... TimeoutExpired
...... SyntaxError
......... IndentationError
............ TabError
...... SystemError
......... CodecRegistryError
...... TokenError
...... TypeError
...... ValueError
......... UnicodeError
............ UnicodeDecodeError
............ UnicodeEncodeError
............ UnicodeTranslateError
......... UnsupportedOperation
...... Warning
......... BytesWarning
......... DeprecationWarning
......... FutureWarning
......... ImportWarning
......... PendingDeprecationWarning
......... ResourceWarning
......... RuntimeWarning
......... SyntaxWarning
......... UnicodeWarning
......... UserWarning
...... _OptionError
...... error (<class 'sre_constants.error'>)
... GeneratorExit
... KeyboardInterrupt
... SystemExit
$ pyenv shell 3.4.3
$ python print_exc_tree.py
Python Version: 3.4.3
BaseException
... Exception
...... ArithmeticError
......... FloatingPointError
......... OverflowError
......... ZeroDivisionError
...... AssertionError
...... AttributeError
...... BufferError
...... EOFError
...... Error (<class 'locale.Error'>)
...... ImportError
......... ZipImportError
...... LookupError
......... CodecRegistryError
......... IndexError
......... KeyError
...... MemoryError
...... NameError
......... UnboundLocalError
...... OSError
......... BlockingIOError
......... ChildProcessError
......... ConnectionError
............ BrokenPipeError
............ ConnectionAbortedError
............ ConnectionRefusedError
............ ConnectionResetError
......... FileExistsError
......... FileNotFoundError
......... InterruptedError
......... IsADirectoryError
......... ItimerError
......... NotADirectoryError
......... PermissionError
......... ProcessLookupError
......... TimeoutError
......... UnsupportedOperation
...... ReferenceError
...... RuntimeError
......... BrokenBarrierError
......... NotImplementedError
......... _DeadlockError
...... StopIteration
...... StopTokenizing
...... SubprocessError
......... CalledProcessError
......... TimeoutExpired
...... SyntaxError
......... IndentationError
............ TabError
...... SystemError
......... CodecRegistryError
...... TokenError
...... TypeError
...... ValueError
......... UnicodeError
............ UnicodeDecodeError
............ UnicodeEncodeError
............ UnicodeTranslateError
......... UnsupportedOperation
...... Warning
......... BytesWarning
......... DeprecationWarning
......... FutureWarning
......... ImportWarning
......... PendingDeprecationWarning
......... ResourceWarning
......... RuntimeWarning
......... SyntaxWarning
......... UnicodeWarning
......... UserWarning
...... _OptionError
...... error (<class 'sre_constants.error'>)
... GeneratorExit
... KeyboardInterrupt
... SystemExit
Ich habe gerade die Details untersucht, also lasse ich es hier, aber hier werde ich besonders darauf achten, dass "IOError" in Python 3.3 verschwunden ist und dass sich die Vererbungsstruktur um "OSError" drastisch geändert hat. Dies ist auch einer der Hauptunterschiede zwischen den aktuellen 2 und 3 Systemen.
Dies ist eine Änderung basierend auf "PEP 3151 - Überarbeitung der Betriebssystem- und E / A-Ausnahmehierarchie". Sie können die Details sehen, indem Sie denselben PEP lesen, aber es scheint, dass ein Hauptfaktor darin besteht, dass der Fehler während des Dateivorgangs zwischen "IOError" und "OSError" aufgeteilt wurde.
>>> os.remove("fff")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: 'fff'
>>> open("fff")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'fff'
Auf dieser Ebene gibt es keinen großen Unterschied zwischen 3,3, 3,4 und 3,5. Auf Baumebene scheinen neue Ausnahmeklassen hinzugefügt worden zu sein (BrokenBarrierError
in 3.3 → 3.4, RecursionError
und StopAsyncIteration
in 3.4 → 3.5).
Die Änderung des Verhaltens jeder Funktion ist jedoch in der Baumstruktur nicht bekannt. Wenn Sie also interessiert sind, lesen Sie das Änderungsprotokoll usw. sorgfältig durch, einschließlich des Unterschieds in Nebenversionen.
Nachtrag (05.08.2017): In der vorherigen Version war es 3.6.0b2, aber da die offizielle Version in 3.6 veröffentlicht wurde, wird es 3.6.2 sein. Ich werde den ganzen Satz vorerst nicht überarbeiten.
Im Anschluss an den obigen Ablauf habe ich auch die 3.6.2-Baumstruktur untersucht, die derzeit entwickelt wird.
Python Version: 3.6.2
BaseException
... Exception
...... ArithmeticError
......... FloatingPointError
......... OverflowError
......... ZeroDivisionError
...... AssertionError
...... AttributeError
...... BufferError
...... EOFError
...... Error (<class 'locale.Error'>)
...... ImportError
......... ModuleNotFoundError
......... ZipImportError
...... LookupError
......... CodecRegistryError
......... IndexError
......... KeyError
...... MemoryError
...... NameError
......... UnboundLocalError
...... OSError
......... BlockingIOError
......... ChildProcessError
......... ConnectionError
............ BrokenPipeError
............ ConnectionAbortedError
............ ConnectionRefusedError
............ ConnectionResetError
......... FileExistsError
......... FileNotFoundError
......... InterruptedError
......... IsADirectoryError
......... ItimerError
......... NotADirectoryError
......... PermissionError
......... ProcessLookupError
......... TimeoutError
......... UnsupportedOperation
...... ReferenceError
...... RuntimeError
......... BrokenBarrierError
......... NotImplementedError
......... RecursionError
......... _DeadlockError
...... StopAsyncIteration
...... StopIteration
...... StopTokenizing
...... SubprocessError
......... CalledProcessError
......... TimeoutExpired
...... SyntaxError
......... IndentationError
............ TabError
...... SystemError
......... CodecRegistryError
...... TokenError
...... TypeError
...... ValueError
......... UnicodeError
............ UnicodeDecodeError
............ UnicodeEncodeError
............ UnicodeTranslateError
......... UnsupportedOperation
...... Verbose
...... Warning
......... BytesWarning
......... DeprecationWarning
......... FutureWarning
......... ImportWarning
......... PendingDeprecationWarning
......... ResourceWarning
......... RuntimeWarning
......... SyntaxWarning
......... UnicodeWarning
......... UserWarning
...... _OptionError
...... error (<class 'sre_constants.error'>)
... GeneratorExit
... KeyboardInterrupt
... SystemExit
$ diff /tmp/352.txt /tmp/362.txt
1c1
< Python Version: 3.5.2
---
> Python Version: 3.6.2
14a15
> ......... ModuleNotFoundError
65a67
> ...... Verbose
Es gibt zwei neue Ausnahmen, aber es scheint auch keine wesentliche Änderung zu sein.
ModuleNotFoundError
Verbose
sre_parse.Verbose
scheint es sich um eine Klasse zu handeln, die um reguläre Ausdrücke verwendet wird. Details wurden nicht untersucht.Klicken Sie hier, um Informationen zu 3.6 zu erhalten: https://docs.python.org/3.6/whatsnew/3.6.html (Da es mit den neuesten Informationen von 3.6 aktualisiert wird, muss es nicht unbedingt 3.6.2 oben sein!)
Beilage 2 (12.12.2017): Der Unterschied zwischen 3.6.2 und dem neuesten 3.6.7 zum Zeitpunkt der Aktualisierung ist unten dargestellt.
$ diff 362.txt 367.txt
1c1
< Python Version: 3.6.2
---
> Python Version: 3.6.7
$ diff 367.txt 371.txt
1c1
< Python Version: 3.6.7
---
> Python Version: 3.7.1
80c80
< ...... error (<class 'sre_constants.error'>)
---
> ...... error (<class 're.error'>)
Es gibt keinen großen Unterschied.
Referenz: https://docs.python.org/3.7/whatsnew/3.7.html
Wenn Sie Python-Laufzeitausnahmen direkt in Ihrem Modul verwenden, können Sie Ihr Modul nicht von Python-Laufzeitfehlern (z. B. "RuntimeError" oder "OSError") unterscheiden. Grundsätzlich ist es üblich, eine Basisausnahme in Ihrem eigenen Modul zu erstellen und daraus einen Ausnahmeklassenbaum zu erstellen. Dies ist ein Konzept, das häufig in anderen Sprachen zu finden ist und die Idee von Ausnahmen eingeführt hat.
Wenn Sie ein eigenes baumstrukturiertes Ausnahmesystem erstellen, empfiehlt Python, "Exception" oder seine Unterklassen als Basisausnahmeklasse (http://docs.python.jp/3/library/exceptions) zu erben. .html).
Sie können die integrierte Ausnahmeklasse in Unterklassen unterteilen, um neue Ausnahmen zu definieren. Wir empfehlen, dass neue Ausnahmen von Exception oder seinen Unterklassen anstelle von BaseException abgeleitet werden. Weitere Informationen zum Definieren von Ausnahmen finden Sie im Abschnitt Benutzerdefinierte Ausnahmen des Python-Lernprogramms.
Ein Wort zu einer anderen Sprache, Ruby.
Laut "Effective Ruby" ist "StandardError" eine gute Basisklasse zum Erstellen benutzerdefinierter Ausnahmen. Es gibt eine gleichnamige Klasse in der 2. Reihe, aber es gibt überhaupt keine Ausnahmeklasse in der Python 3-Reihe. Betrachten Sie also "Ausnahme" und ihre Unterklassen.
Beachten Sie beim Umschalten zwischen mehreren Programmiersprachen die geringfügigen Unterschiede bei Konventionen, Regeln und Konventionen.
2016-09-14
2016-10-24
error
"(3.2) enthält.2016-10-25
Rückblickend könnte es freundlicher gewesen sein, "cls .__ module__! =" Builtins "als" cls .__ name__ "zu verwenden. Lower () ==" error "im obigen Zweig des Validierungscodes. nicht. Wir planen dies, wenn wir das nächste Mal eine größere Korrektur vornehmen.
Obwohl der Titel "Integrierte Ausnahmebaumstruktur" lautet, erfordert die angezeigte Baumstruktur keinen Import wie "Ausnahme" (integrierte) Ausnahmeklasse und "io.UnsupportedOperation" Es gibt einige Ausnahmeklassen wie `, die nicht gelesen werden können, ohne ein Modul zu importieren. Wenn Sie zum Beispiel "Hmm, was ist" Verbose "" denken und nachschlagen?
Python 3.6.0b2 (default, Oct 25 2016, 09:04:16)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> help(Verbose)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'Verbose' is not defined
>>> import sre_parse
>>> help(sre_parse.Verbose)
(Hilfe wird angezeigt)
Und Verwirrung stiften.
2017-08-05
Wir haben 3.6.2 anstelle von 3.6.0b2 übernommen. Als Referenz wird das Ergebnis von 3.7-dev veröffentlicht.
2018-12-12
2020-03-29
Die Fortsetzung ist ein separater Artikel.
https://qiita.com/amedama/items/e1a605c004d1e2276778
Zur gleichen Zeit schrieb ich über das obige " StopTokenizing
SubprocessError
verschwindet aus der Ausnahmeliste". Der Punkt ist: "Es gibt keine Möglichkeit für Eltern, ihre Kinder zu kennen, da sie beim Start der Laufzeit nicht geladen werden", aber es scheint nicht aus der Implementierung zu verschwinden.
Recommended Posts