Прочитав документы и несколько раз и покопавшись в источнике и оболочке, я думаю, я понял это. Документы, вероятно, могли бы улучшить, чтобы прояснить, каково поведение.
Модуль предупреждений ведет реестр на __warningsregistry__, чтобы отслеживать, какие предупреждения были показаны. Если предупреждение (сообщение) отсутствует в реестре до того, как будет установлен фильтр «error», любые вызовы warn () не приведут к добавлению сообщения в реестр. Кроме того, реестр предупреждений не создается до первого вызова с предупреждением:
>>> import warnings
>>> __warningregistry__
------------------------------------------------------------
Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
NameError: name '__warningregistry__' is not defined
>>> warnings.simplefilter('error')
>>> __warningregistry__
------------------------------------------------------------
Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
NameError: name '__warningregistry__' is not defined
>>> warnings.warn('asdf')
------------------------------------------------------------
Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
UserWarning: asdf
>>> __warningregistry__
{}
Теперь, если мы проигнорируем предупреждения, они будут добавлены в реестр предупреждений:
>>> warnings.simplefilter("ignore")
>>> warnings.warn('asdf')
>>> __warningregistry__
{('asdf', <type 'exceptions.UserWarning'>, 1): True}
>>> warnings.simplefilter("error")
>>> warnings.warn('asdf')
>>> warnings.warn('qwerty')
------------------------------------------------------------
Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
UserWarning: qwerty
Таким образом, фильтр ошибок будет применяться только к предупреждениям, которых еще нет в реестре предупреждений. Чтобы ваш код работал, вам нужно будет удалить соответствующие записи из реестра предупреждений, когда вы закончите с менеджером контекста (или вообще в любое время после того, как вы использовали фильтр игнорирования и хотите, чтобы предыдущее использованное сообщение подобрать фильтр ошибок). Кажется немного не интуитивным ...