По запросу вот ответ отдельным постом:
Хитрость заключается в использовании предупреждений «with» при импорте sklearn
(или зависимости, которая использует sklearn, в моем случае это был пакет hdbscan
):
with warnings.catch_warnings():
# filter sklearn\externals\joblib\parallel.py:268:
# DeprecationWarning: check_pickle is deprecated
warnings.simplefilter("ignore", category=DeprecationWarning)
import hdbscan
Это отключит DeprecationWarning только для этого модуля (поскольку модификация warnings
присоединена к блоку with).
Важно поместить этот оператор на первую позицию в вашем коде, куда импортируется модуль, иначе он не будет работать. Например. если бы я загружал hdbscan
в __init__.py
, и вышеуказанный блок кода появляется в некотором подклассе, который также загружает hdbscan
, я все равно получил бы DeprecationWarning, потому что Python игнорирует любой последующий оператор import
, если модуль / пакет уже загружен.
Поэтому важно проверить, какие модули / пакеты используют joblib\parallel.py
и где они, с точки зрения линейного кода, загружаются раньше всего в кучу объектов python.
[EDIT]
Как отмечает @devforfu в комментариях, вышеупомянутое решение не работает (больше). Я снова посмотрел на это и с Python 3.7 DeprecationWarning is once again shown by default when triggered directly by code in __main__.
. Кроме того, ignore
предупреждения не работают, когда Dependency явно загружает устаревший модуль какого-либо другого пакета.
Это то, что происходит в моем примере hdbscan
, который загружает устаревшие модули sklearn.external.six
и sklearn.externals.joblib
.
Вот как, наконец, решить эту надоедливую проблему:
- убедитесь, что вы явно установили автономные пакеты, которые устарели, например,
conda install -c conda-forge joblib six
- создать поддельный импорт, который переопределит импорт зависимостей, например ::
try:
sys.modules['sklearn.externals.six'] = __import__('six')
sys.modules['sklearn.externals.joblib'] = __import__('joblib')
import hdbscan
except ImportError:
import hdbscan
Если нет ошибки импорта, будет использоваться автономная шестерка и joblib. В противном случае, например если пользователь не установил шесть или joblib, программа все равно будет работать (поскольку она загружает оба модуля из sklearn.externals), но при этом отобразится предупреждение об амортизации.