Как может я переменные проверки типа в Python?

32
задан Bill the Lizard 4 June 2012 в 12:49
поделиться

6 ответов

isinstance(n, int)

, Если необходимо знать, является ли это определенно фактическим интервалом и не подклассом интервала (обычно Вы не должны должны быть делать это):

type(n) is int

это:

return int(n) == n

не такая хорошая идея, поскольку перекрестные сравнения типов могут быть верными - особенно int(3.0)==3.0

35
ответ дан 27 November 2019 в 20:34
поделиться
if type(n) is int

Это проверяет, ли n интервал Python, и только интервал. Это не примет подклассы int.

проверка Типа, однако, не соответствует "Python путь". Вы лучше используете n в качестве интервала, и если он выдает исключение, поймайте его и реагируйте на него.

4
ответ дан 27 November 2019 в 20:34
поделиться

Да, как 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
16
ответ дан 27 November 2019 в 20:34
поделиться

Не вводите проверку. Смысл утиного ввода - то, что Вы не должны иметь к. Например, что, если кто-то сделал что-то вроде этого:

class MyInt(int):
    # ... extra stuff ...
1
ответ дан 27 November 2019 в 20:34
поделиться

Программирование в 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).

1
ответ дан 27 November 2019 в 20:34
поделиться

Я бы хотел сказать что-то вроде:

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)

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

0
ответ дан 27 November 2019 в 20:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: