Какой самый питонный способ проверить, что входные данные - это правильно сформированные числа - PullRequest
2 голосов
/ 16 декабря 2008

У меня есть функция, которая ожидает действительные числа (целые числа или числа с плавающей запятой) в качестве входных данных, и я пытаюсь проверить этот ввод перед выполнением математических операций с ним.

Мой первый инстинкт заключается в том, чтобы вводить входные данные как числа с плавающей точкой из блока try-кроме.

try:
   myinput = float(input)
except:
   raise ValueError("input is not a well-formed number")

Я также мог бы позвонить isinstance(mydata, (float, int, long) ), но список "все это могут быть числа" кажется мне несколько не элегантным.

Какой самый питонический способ это сделать? Есть еще один вариант, который я упустил?

Ответы [ 4 ]

12 голосов
/ 16 декабря 2008

Процитирую себя из Сколько проверки ввода я должен сделать для своих функций / методов python? :

Для таких вычислений, как сумма, факториал и т. Д., Проверка встроенных типов питонов будет работать хорошо. Вычисления завершатся с вызовом add, mul и т. Д. Для типов, и если они прервутся, они все равно сгенерируют правильное исключение. Применив свои собственные проверки, вы можете аннулировать неработающий ввод.

Таким образом, лучший вариант - оставить проверку типов до Python. Если вычисление не удастся, проверка типа Python выдаст исключение, поэтому, если вы сделаете это самостоятельно, вы просто дублируете код, что означает дополнительную работу от вашего имени.

5 голосов
/ 16 декабря 2008

В Python 2.6 и 3.0 иерархия типов числовых абстрактных типов данных была добавлена ​​, поэтому вы можете выполнить проверку как:

>>> import numbers
>>> isValid = isinstance(myinput , numbers.Real)

числа. Real будет соответствовать целочисленному типу или типу с плавающей запятой, но не нечисловым типам или комплексным числам (используйте для этого числа. Сложное). Это также будет соответствовать рациональным числам, но, вероятно, вы захотите включить и их. то есть:

>>> [isinstance(x, numbers.Real) for x in [4, 4.5, "some string", 3+2j]]
[True, True, False, False]

К сожалению, все это в Python> = 2.6, поэтому не будет полезно, если вы разрабатываете для 2.5 или более ранней версии.

2 голосов
/ 16 декабря 2008

Возможно, вы можете использовать комбинацию операторов assert и isinstance. Что-то вроде следующего: я думаю, что это более питонический способ, когда вы выкидываете исключение, когда ваши данные не соответствуют вашим требованиям. К сожалению, я не вижу лучшего определения того, что является действительным числом, чем ваше. Может быть, кто-то придет с лучшей идеей.

number = (float, int, long)
assert isinstance(mydata, (float, int, long))
1 голос
/ 16 декабря 2008

Я не понимаю вопрос.

Есть две вещи с дико отличающейся семантикой, которые можно рассматривать как "альтернативы".

Преобразование типов - это одно. Он работает с любым объектом, поддерживающим __float__, который может быть довольно разнообразным, но немногие из них на самом деле являются числовыми.

try:
   myinput = float(input)
except:
   raise ValueError("input is not a well-formed number")
# at this point, input may not be numeric at all
# it may, however, have produced a numeric value

Типовое испытание - это другое. Это работает только с объектами, которые являются собственными экземплярами определенного набора классов.

isinstance(input, (float, int, long) )
# at this point, input is one of a known list of numeric types

Вот пример класса, который отвечает на float, но все еще не числовой.

class MyStrangeThing( object ):
    def __init__( self, aString ):
        # Some fancy parsing 
    def __float__( self ):
        # extract some numeric value from my thing

Вопрос "действительные числа (целые числа или числа с плавающей точкой)", как правило, не имеет значения. Многие вещи являются «числовыми» и могут использоваться в числовой операции, но не являются целыми числами или числами с плавающей запятой. Например, вы, возможно, скачали или создали пакет рациональных чисел.

Нет смысла переоценивать входные данные, если у вас нет алгоритма, который не будет работать с некоторыми типами. Они редки, но некоторые вычисления требуют целых чисел, в частности, чтобы они могли выполнять операции целочисленного деления и остатка. Для них вы можете утверждать, что ваши значения являются целыми числами.

...