Pythonic обработка этого случая ошибки - PullRequest
2 голосов
/ 04 сентября 2011

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

Как вы думаете, я должен сохранить утверждение?

class WeakBoundMethod:
    def __init__(self, meth):
        assert (hasattr(meth, '__func__') and hasattr(meth, '__self__')),\
               'Object is not a bound method.'

        self._self = weakref.ref(meth.__self__)
        self._func = meth.__func__

Ответы [ 2 ]

4 голосов
/ 04 сентября 2011

assert - это , а не для проверки ввода, это для поиска недостатков в допущениях , на которых вы создали свой код. Это инструмент отладки и документирования, но его можно отключить. Если вы хотите предоставить хорошее сообщение об ошибке, raise TypeError("Object is not a bound method") - вот для чего оно.

1 голос
/ 04 сентября 2011

Мне кажется, что assert здесь проверяет предположение, которое делает код. Он потерпит неудачу, если класс будет использован неправильно (т.е. ошибка программирования).

Если это действительно так, то использование assert здесь ИМХО оправдано. Правда, Python щедро выдает исключения, когда что-то используется неправильно, и EAFP - хорошая стратегия. Тем не менее, иногда ошибки, выдаваемые интерпретатором, не являются достаточно описательными, чтобы упростить поиск проблемы, и в таких случаях assert уместно. Он также должен быть связан с соответствующей документацией, в которой указано, как класс ожидает использования (т. Е. Переданный метод должен иметь определенные атрибуты).


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

...