开发者

Pythonic handling of this error case

In the code below, is my use of assert justified? If anything is wrong, an error will occur anyway when I try to access the attributes. On the other hand, the assert provides a descriptive error message.

Do you think I sho开发者_运维问答uld keep the assertion?

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__


assert is not for input validation, it's for finding flaws in the assumptions you built your code on. It's a debugging and documentation tool, but it can be disabled. If you want to provide a good error message, raise TypeError("Object is not a bound method") - that's what it's for.


It appears to me that the assert here is checking an assumption the code is making. It will fail if the class is used incorrectly (i.e. programming error).

If this is indeed the case, then the use of assert here is IMHO justified. True, Python generously throws exceptions when things are used incorrectly, and EAFP is a good strategy. Yet, sometimes the errors thrown by the interpreter aren't descriptive enough to make it easy to locate the problem, and an assert in such cases is appropriate. It should also be coupled with appropriate documentation that states how the class expects to be used (i.e. the passed method should have certain attributes).


If I have misunderstood your sample and you're using the assert here to validate something the user could err with, then it's not a good idea.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜