Подавить предупреждения для python-xarray

Я запускаю следующий код

positive_values = values.where(values > 0)  

В этом примере values может содержать nan элементов. Я считаю, что по этой причине я получаю следующее предупреждение во время выполнения:

RuntimeWarning: invalid value encountered in greater_equal if not reflexive  

Есть ли у xarray методы подавления этих предупреждений?


person Conic    schedule 13.12.2016    source источник
comment
что-то вроде positive_values = values.where(values.notnull & values > 0)?   -  person John Coleman    schedule 13.12.2016
comment
Мне нравится это предложение. Спасибо.   -  person Conic    schedule 13.12.2016


Ответы (2)


Модуль warnings предоставляет нужные вам функции.

Чтобы подавить все предупреждения, выполните следующие действия (см. ответ Джона Коулмана, почему это не рекомендуется):

import warnings
warnings.simplefilter("ignore") 
# warnings.simplefilter("ignore", category=RuntimeWarning) # for RuntimeWarning only

Чтобы сделать подавление временным, сделайте это внутри контекстного менеджера warnings.catch_warnings():

import warnings

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    positive_values = values.where(values > 0)  

Менеджер контекста сохраняет исходные настройки предупреждения перед входом в контекст, а затем устанавливает их обратно при выходе из контекста.

person Steven Rumbalski    schedule 13.12.2016
comment
Спасибо за столь быстрый ответ. Я поклонник краткости/удобочитаемости. Это добавляет много шума в код с точки зрения удобочитаемости. Существуют ли способы использования библиотеки предупреждений для глобального подавления определенных предупреждений (IE: предупреждение во время выполнения)? Или это лучшее, что есть у питона на данный момент? - person Conic; 13.12.2016
comment
В верхней части основного модуля сделайте import warnings;warnings.simplefilter("ignore", category=RuntimeWarning). Это подавит все RuntimeWarnings. Как указывает @JohnColeman, это не очень хорошая практика. Эти предупреждения существуют не просто так. Я бы особенно предостерег от глобального подавления предупреждений, потому что вы не знаете, какие предупреждения вы в конечном итоге пропустите. - person Steven Rumbalski; 13.12.2016

Как правило, к предупреждениям следует прислушиваться, а не подавлять их. Либо вы знаете, что вызывает предупреждение, либо нет. Если вы знаете, что вызывает предупреждение, обычно существует простой обходной путь. Если вы не знаете, что вызывает предупреждение, скорее всего, это ошибка. В этом случае вы можете использовать короткое замыкание & следующим образом:

positive_values = values.where(values.notnull() & values > 0)
person John Coleman    schedule 13.12.2016
comment
Спасибо за этот ответ. Я открыл вопрос о том, почему в первую очередь выдается предупреждение, если вам интересно. Вы можете найти его по адресу: stackoverflow.com/questions/41130138/ - person Conic; 13.12.2016