[Python-Dev] PEP 572 and assert

Steven D'Aprano steve at pearwood.info
Tue Jul 17 13:41:08 EDT 2018


On Tue, Jul 17, 2018 at 07:24:12PM +0300, Serhiy Storchaka wrote:
> 17.07.18 18:48, Guido van Rossum пише:
> >On Tue, Jul 17, 2018 at 8:28 AM, Serhiy Storchaka <storchaka at gmail.com 
> ><mailto:storchaka at gmail.com>> wrote:
> >    Should not the assert statement introduce an implicit lexical scope
> >    for preventing leaking variables?
> >
> >I don't see why. As Chris said, side effects in asserts are nothing new 
> >and this PEP is not the one to do something about it.
> 
> This side effect is new. No other expressions that can be used in 
> asserts leaked local variables before.

assert vars().__setitem__('foo', 42) or foo

Not that anyone would write such a thing (and it probably won't work 
inside a function in CPython), but it is possible.

Besides, there is a legitimate use for assignment expressions in 
assertions:

    assert (spam := something) > 2, 'not enough spam'
    assert  sequence[foo] == 999, 'sequence item isn't 999'

Sometimes you need two assertions.


> We can't make the assignment expression itself creating its own scope, 
> because this will invalidate its purpose. But the problem with assert 
> ccould be solved by making assert creating a new lexical scope.

Assertions could be used to perform imports too:

assert __import__('math')

but people don't do that either. Let's not try fixing "problems" that 
won't exist. Most people have more sense than to do that.

And for those who don't and misuse assertions, well, they've been 
misusing them for two decades and the sky hasn't fallen.


>     assert expr, msg
> 
> could be translated to
> 
>     if __debug__ and not (lambda: expr)():
>         raise AssertionError(msg)

YAGNI.

I do a lot of work in the REPL where I'm not afraid to bend the rules 
and use hacks I'd never use in long-lasting code. I'd never use assert 
for testing input in real code, but I do it in the REPL all the time.

If I choose to abuse assertions in the REPL, you ought to trust me to do 
this responsibly. I'm a consenting adult. If I want to run with 
scissors, point a loaded gun at my foot, put all my eggs in one basket, 
or use assignment expressions in an assertion, I don't want the 
interpreter telling me I can't.



-- 
Steve


More information about the Python-Dev mailing list