isinstance(n, int)
, Если необходимо знать, является ли это определенно фактическим интервалом и не подклассом интервала (обычно Вы не должны должны быть делать это):
type(n) is int
это:
return int(n) == n
не такая хорошая идея, поскольку перекрестные сравнения типов могут быть верными - особенно int(3.0)==3.0
if type(n) is int
Это проверяет, ли n
интервал Python, и только интервал. Это не примет подклассы int
.
проверка Типа, однако, не соответствует "Python путь". Вы лучше используете n
в качестве интервала, и если он выдает исключение, поймайте его и реагируйте на него.
Да, как Evan сказал, не вводите проверку. Просто попытайтесь использовать значение:
def myintfunction(value):
""" Please pass an integer """
return 2 + value
, Который не имеет typecheck. Это намного лучше! Давайте посмотрим то, что происходит, когда я пробую его:
>>> myintfunction(5)
7
, Который работает, потому что это - целое число. Гм. Позволяет пробуют некоторый текст.
>>> myintfunction('text')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in myintfunction
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Это показывает ошибку, TypeError, который является тем, что это должно сделать так или иначе. Если вызывающая сторона хочет поймать это, это возможно.
, Что Вы сделали бы, если бы Вы сделали typecheck? Показать ошибочное право? Таким образом, Вы не имеете к typecheck, потому что ошибка уже обнаруживается автоматически.
Плюс то, так как Вы не сделали typecheck, у Вас есть своя функция, работающая с другими типами:
Плавания:
>>> print myintfunction(2.2)
4.2
Комплексные числа:
>>> print myintfunction(5j)
(2+5j)
Десятичные числа:
>>> import decimal
>>> myintfunction(decimal.Decimal('15'))
Decimal("17")
Даже абсолютно произвольные объекты, которые могут добавить числа!
>>> class MyAdderClass(object):
... def __radd__(self, value):
... print 'got some value: ', value
... return 25
...
>>> m = MyAdderClass()
>>> print myintfunction(m)
got some value: 2
25
, Таким образом, Вы ясно ничего не получаете typechecking. И проиграйте много.
<час>, Так как Вы отредактировали вопрос, теперь ясно, что Ваше приложение называет некоторую восходящую стандартную программу, которая имеет смысл только с ints.
При этом, я все еще думаю, что необходимо передать параметр , как получено к восходящей функции. Восходящая функция будет иметь дело с ним правильно, например, повышение ошибки, если это должно будет. Я высоко сомнение, что Ваша функция, которая имеет дело с дюйм/с, будет вести себя странно при передаче его плавание. Если можно дать нам название библиотеки, мы можем проверить это на Вас.
, Но... Если восходящая функция будет вести себя неправильно и уничтожать некоторых детей при передаче ее плавание (я все еще высоко сомневаюсь относительно этого), то просто просто звонят int()
на нем:
def myintfunction(value):
""" Please pass an integer """
return upstreamfunction(int(value))
Вы все еще не typechecking, таким образом, Вы извлекаете большую часть пользы из не typechecking.
<час>, Если даже, в конце концов, что, Вы действительно хотите ввести проверку, несмотря на него уменьшающий удобочитаемость Вашего приложения и производительность для абсолютно никакого преимущества, использование assert
, чтобы сделать это.
assert isinstance(...)
assert type() is xxxx
Тот путь мы можем выключить assert
с и удалить это <sarcasm>
функция </sarcasm>
из программы путем вызова его как [1 133]
python -OO program.py
Не вводите проверку. Смысл утиного ввода - то, что Вы не должны иметь к. Например, что, если кто-то сделал что-то вроде этого:
class MyInt(int):
# ... extra stuff ...
Программирование в Python и выполнение typechecking, как Вы могли бы на других языках, действительно походят на выбор отвертки для стука по гвоздю в с. Это более изящно для использования функций обработки исключений Python.
Из интерактивной командной строки можно выполнить оператор как:
int('sometext')
Это генерирует ошибку - ipython, говорит мне:
<type 'exceptions.ValueError'>: invalid literal for int() with base 10: 'sometext'
Теперь можно написать некоторый код как:
try:
int(myvar) + 50
except ValueError:
print "Not a number"
Это может быть настроено для выполнения независимо от того, что операции требуются И зафиксировать любые ошибки, которые ожидаются. Это выглядит немного замысловатым, но соответствует синтаксису и идиомам Python и приводит к очень читаемому коду (после того как Вы привыкаете к говорящему Python).
Я бы хотел сказать что-то вроде:
def check_and_convert(x):
x = int(x)
assert 0 <= x <= 255, "must be between 0 and 255 (inclusive)"
return x
class IPv4(object):
"""IPv4 CIDR prefixes is A.B.C.D/E where A-D are
integers in the range 0-255, and E is an int
in the range 0-32."""
def __init__(self, a, b, c, d, e=0):
self.a = check_and_convert(a)
self.b = check_and_convert(a)
self.c = check_and_convert(a)
self.d = check_and_convert(a)
assert 0 <= x <= 32, "must be between 0 and 32 (inclusive)"
self.e = int(e)
Таким образом, когда вы используете можно передать что угодно, но вы сохраняете только действительное целое число.