Да, как сказал Эван, не проверяйте типаж. Просто попробуйте использовать значение:
def myintfunction(value):
""" Please pass an integer """
return 2 + value
Здесь нет проверки типов. Это намного лучше! Посмотрим, что будет, когда я попробую:
>>> 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, что он должен делать в любом случае. Если вызывающий хочет это поймать, это возможно.
Что бы вы сделали, если бы проверили тип? Показывать ошибку верно? Таким образом, вам не нужно выполнять проверку типов, потому что ошибка уже появляется автоматически.
Кроме того, поскольку вы не выполняли проверку типов, ваша функция работает с другими типами:
Поплавки:
>>> 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
Таким образом, вы явно ничего не получите от проверки типов. И много потеряешь.
ОБНОВИТЬ:
Поскольку вы отредактировали вопрос, теперь ясно, что ваше приложение вызывает некоторую подпрограмму восходящего потока, которая имеет смысл только с целыми числами.
В этом случае я все же думаю, что вам следует передать параметр как получено восходящей функции. Функция восходящего потока справится с этим правильно, например. выдает ошибку, если это необходимо. Я очень сомневаюсь, ваша функция, которая имеет дело с IP-адресами, будет вести себя странно, если вы передадите ей число с плавающей запятой. Если вы можете сообщить нам название библиотеки, мы можем это проверить.
Но ... Если восходящая функция будет вести себя некорректно и убьет некоторых детей, если вы передадите ей число с плавающей запятой (я все еще очень сомневаюсь в этом), тогда просто вызовите int()
:
def myintfunction(value):
""" Please pass an integer """
return upstreamfunction(int(value))
Вы по-прежнему не проверяете типы, поэтому вы получаете максимальную пользу от отказа от проверки типов.
Если даже после всего этого вы действительно хотите ввести проверку, несмотря на то, что это снижает читаемость и производительность вашего приложения без каких-либо преимуществ, используйте для этого assert
.
assert isinstance(...)
assert type() is xxxx
Таким образом, мы можем отключить assert
s и удалить эту <sarcasm>
функцию </sarcasm>
из программы, вызвав ее как
python -OO program.py
person
nosklo
schedule
21.01.2009