В чем разница между __cause__ и __context__?

Это атрибуты для исключений Python, но я не могу понять их. Документация Python кажется довольно тихой по этому поводу. Я просмотрел документацию, но немного запутался. Итак, в чем разница между ними и как они используются?

РЕДАКТИРОВАТЬ: В этой заметке, как они связаны с __traceback__, если вообще?

РЕДАКТИРОВАТЬ 3: Думаю, я просто не понимаю __cause__. Наконец-то я понял __traceback__и __context__. Почему attribute_error.__cause__не относится к AttributeError()?

try:
    raise NameError() from OSError
except NameError as name_error:
    print('name_error.__cause__: %s' % repr(name_error.__cause__))
    print('name_error.__context__: %s' % repr(name_error.__context__))
    print('name_error.__traceback__: %s' % repr(name_error.__traceback__))
    try:
        raise AttributeError()
    except AttributeError as attribute_error:
        print('attribute_error.__cause__: %s' % repr(attribute_error.__cause__))
        print('attribute_error.__context__: %s' % repr(attribute_error.__context__))
        print('attribute_error.__traceback__: %s' % repr(attribute_error.__traceback__))
        raise attribute_error from IndexError

Это выводит

name_error.__cause__: OSError()
name_error.__context__: None
name_error.__traceback__: 
attribute_error.__cause__: None
attribute_error.__context__: NameError()
attribute_error.__traceback__: 
Traceback (most recent call last):
  File "C:\test\test.py", line 13, in 
    raise attribute_error from IndexError
  File "C:\test\test.py", line 8, in 
    raise AttributeError()
AttributeError

10
задан Tyler Crompton 27 June 2012 в 23:36
поделиться