Стандартное решение для сортировки OrderBy
, как показано в Как я могу заказать List & lt; string & gt;? , должен работать в этом случае, вы просите его заказать по Version
:
var listOfStrings = new List{"1.2", "2.3", "0.1"};
listOfStrings = listOfStrings.OrderBy(x => new Version(x)).ToList();
Кажется, что ваша конфигурация использует опцию print
для numpy.seterr
:
>>> import numpy as np
>>> np.array([1])/0 #'warn' mode
__main__:1: RuntimeWarning: divide by zero encountered in divide
array([0])
>>> np.seterr(all='print')
{'over': 'warn', 'divide': 'warn', 'invalid': 'warn', 'under': 'ignore'}
>>> np.array([1])/0 #'print' mode
Warning: divide by zero encountered in divide
array([0])
Это означает, что предупреждение, которое вы видите, не является реальным предупреждением, но это всего лишь некоторые символы, напечатанные на stdout
(см. документацию для seterr
). Если вы хотите его поймать, вы можете:
numpy.seterr(all='raise')
, который будет напрямую возбуждать исключение. Это, однако, изменяет поведение всех операций, поэтому это довольно большое изменение в поведении. numpy.seterr(all='warn')
, который преобразует печатное предупреждение в реальное предупреждение, и вы сможете использовать выше, чтобы локализовать это изменение в поведении. Как только у вас есть предупреждение, вы можете использовать модуль warnings
для управления обработкой предупреждений:
>>> import warnings
>>>
>>> warnings.filterwarnings('error')
>>>
>>> try:
... warnings.warn(Warning())
... except Warning:
... print 'Warning was raised as an exception!'
...
Warning was raised as an exception!
Внимательно прочитайте документацию для filterwarnings
, поскольку она позволяет фильтровать только предупреждение, которое вы хотите, и имеет другие параметры. Я также хотел бы рассмотреть catch_warnings
, который является менеджером контекста, который автоматически сбрасывает исходную функцию filterwarnings
:
>>> import warnings
>>> with warnings.catch_warnings():
... warnings.filterwarnings('error')
... try:
... warnings.warn(Warning())
... except Warning: print 'Raised!'
...
Raised!
>>> try:
... warnings.warn(Warning())
... except Warning: print 'Not raised!'
...
__main__:2: Warning:
Чтобы добавить немного к ответу @ Bakuriu:
Если вы уже знаете, где может возникнуть предупреждение, часто бывает полезно использовать контекстный менеджер numpy.errstate
а не numpy.seterr
, который обрабатывает все последующие предупреждения одного и того же типа независимо от того, где они происходят в вашем коде:
import numpy as np
a = np.r_[0]
with np.errstate(divide='raise'):
try:
a / 0 # this gets caught and handled as an exception
except FloatingPointError:
print('oh no!')
a / 0 # this prints a RuntimeWarning as usual
FloatingPointError
, а не ZeroDivisionError
.
– gerrit
6 December 2016 в 16:32
Чтобы подробно остановиться на ответе @ Bakuriu выше, я обнаружил, что это позволяет мне поймать предупреждение во время выполнения так же, как я поймаю предупреждение об ошибке, распечатав предупреждение красиво:
import warnings
with warnings.catch_warnings():
warnings.filterwarnings('error')
try:
answer = 1 / 0
except Warning as e:
print('error found:', e)
Вы, вероятно, сможете поиграть с размещением места warnings.catch_warnings () в зависимости от того, насколько большой размер зонтика, который вы хотите использовать, с такими ловушками.
Удалить предупреждения.filterwarnings и добавить:
numpy.seterr(all='raise')
RuntimeWarning
. Обновлен ответ. – Bakuriu 10 April 2013 в 20:01RuntimeWarning
поднят. Проблема может заключаться в том, что ваша конфигурация numpy использует параметрprint
, который просто печатает предупреждение, но это не является реальным предупреждением, обрабатываемым модулемwarnings
... Если это так, вы можете попытаться использоватьnumpy.seterr(all='warn')
и попробуй еще раз. – Bakuriu 10 April 2013 в 20:08numpy
вы не можете использоватьnumpy.seterr(all='error')
,error
должно бытьraise
. – detly 14 May 2014 в 03:32