Сколько контроля ввода я должен делать на своих функциях/методах Python?

Убедитесь, что службы Internet Information Services (IIS) включены в функциях Windows на вашем компьютере.

15
задан Lawrence Johnston 15 December 2008 в 15:07
поделиться

6 ответов

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

6
ответ дан 1 December 2019 в 02:38
поделиться

Я assert, что абсолютно необходимо.

Важный: что абсолютно важно. Некоторые люди сверхтестируют вещи.

def factorial(num):
    assert int(num)
    assert num > 0

Не абсолютно корректно. долго также легальная возможность.

def factorial(num):
    assert type(num) in ( int, long )
    assert num > 0

лучше, но все еще прекрасен. Много типов Python (как рациональные числа или подобные числу объекты) могут также работать в хорошей функции факториала. Трудно утверждать, что объект имеет основные подобные целому числу свойства, не будучи слишком определенным и устраняющим будущим, о котором не думают - классов из рассмотрения.

я никогда не определяю уникальные исключения для отдельных функций. Я определяю уникальное исключение для значительного модуля или пакета. Обычно, однако, просто Error класс или что-то подобное. Тем путем в приложении говорится except somelibrary.Error,e:, который является обо всем, что необходимо знать. Мелкомодульные исключения становятся суетливыми и глупыми.

я никогда не делал этого, но я вижу места, где это могло бы быть необходимо.

assert all( type(i) in (int,long) for i in someList ) 

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

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

9
ответ дан 1 December 2019 в 02:38
поделиться

Я пытаюсь записать утверждение docstring, какой параметр ожидается и принимается, и я не проверяю его явно в мои функции.

, Если кто-то хочет использовать мою функцию с каким-либо другим типом ее его обязанность проверить, эмулирует ли его тип тот, я принимаю достаточно хорошо. Возможно, Ваш факториал может использоваться с некоторым пользовательским как будто длинным типом для получения чего-то, о чем Вы не думали бы? Или возможно Ваша сумма может использоваться для конкатенации строк? Почему необходимо запретить его проверкой типа? Это не C, так или иначе.

5
ответ дан 1 December 2019 в 02:38
поделиться

Я в основном пытаюсь преобразовать переменную в то, чем это должно быть и отказаться или выдать соответствующее исключение, если это перестало работать.

def factorial(num):
    """Computes the factorial of num."""
    try:
        num = int(num)
    except ValueError, e:
        print e
    else:
        ...
4
ответ дан 1 December 2019 в 02:38
поделиться

Это скорее зависит от того, что я пишу, и как вывод добирается там. Python не имеет общедоступных/частных мер защиты других языков OO. Вместо этого существуют конвенции. Например, внешний код должен только назвать методы объекта, которые не снабжаются префиксом подчеркиванием.

Поэтому, если бы я пишу модуль, я проверил бы что-либо, что не сгенерировано из моего собственного кода, т.е. любых вызовов к публично доступным методам/функциям. Иногда, если я знаю, что проверка является дорогой, я делаю ее togglable с kwarg:

def publicly_accessible_function(arg1, validate=False):
  if validate:
    do_validation(arg1)
   do_work

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

2
ответ дан 1 December 2019 в 02:38
поделиться

Я почти никогда не осуществляю, любой своего рода проверяет, если я не думаю, что существует возможность, что кто-то мог бы думать, что они могут передать приблизительно X, которые привели бы к абсолютно сумасшедшим результатам.

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

1
ответ дан 1 December 2019 в 02:38
поделиться
Другие вопросы по тегам:

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