[Python-ideas] Repurpose `assert' into a general-purpose check

Nick Coghlan ncoghlan at gmail.com
Thu Jan 18 00:41:17 EST 2018


On 18 January 2018 at 07:46, Steven D'Aprano <steve at pearwood.info> wrote:
> To justify a keyword, it needs to do something special that a built-in
> function can't do, like delayed evaluation (without wrapping the
> expression in a function).

My reaction to these threads for a while has been "We should just add
a function for unconditional assertions in expression form", and I
finally got around to posting that to the issue tracker rather than
leaving it solely in mailing list posts:
https://bugs.python.org/issue32590

The gist of the idea is to add a new ensure() builtin along the lines of:

    class ValidationError(AssertionError):
        pass

    _MISSING = object()

    def ensure(condition, msg=_MISSING, exc_type=ValidationError):
        if not condition:
            if msg is _MISSING:
                msg = condition
            raise exc_type(msg)

There's no need to involve the compiler if you're never going to
optimise the code out, and code-rewriters like the one in pytest can
be taught to recognise "ensure(condition)" as being comparable to an
assert statement.

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia


More information about the Python-ideas mailing list