On Sun, Nov 15, 2020 at 03:18:29PM +0300, Paul Sokolovsky wrote:

> > > amount of work to implement pattern matching is certainly an order
> > > of magnitude larger than to introduce constants  
[...]

[Steve]
> > Here's a toy proposal,
> []
> 
> The baseline of my version is much simpler:
> 
> # This makes "const" a kind of hard keyword for this module
> from __future__ import const
> 
> FOO: const = 1  # obviously, this is constant
> Foo_Bar: const = 2  # this is too
> foo: const = 3  # and like it or not, but this is constant either
> 
> "const" annotation is recognized by compiler (scope resolving
> component, aka symtable builder to be exact) as a property orthogonal to
> localness/globalness. Literally, "symtable" module
> (https://docs.python.org/3/library/symtable.html#symtable.Symbol) will
> grow Symbol.is_const() method.

Oh, well, if all it takes is to add a new keyword, then constants are 
easy! No need to worry about how constantness affects name resolution,
or how the syntax interacts with type-hints:

    spam: const: Widget = build_widget(*args)
    # Maybe this is better?
    # let spam: Widget = build_widget(*args)


or how "constant" interacts with mutability:

    spam: const = []
    spam.append(99)  # Allowed?
    spam.extend(items)
    spam.sort()


or for that matter, whether or not constants are actually constant.

    spam: const = 1
    spam = 2


If constants aren't actually constant, but just a tag on symbols, then 
you would be right, it probably would be trivially easy to add 
"constants" to Python.

But I think most people agree making them behave as constants is a 
pretty important feature. *The* most critical feature of all, really. 

Given a declared constant:

    # Module a.py
    x: const = None

how do you prevent not just code in module `a` from rebinding the value:

    x = 1
    globals()['x'] = 2
    exec('x = 3', globals())

but other modules as well:

    # Module b.py
    import a
    a.x = 'spam'
    vars(a)['x'] = 'spam'
    exec('x = 3', vars(a))


-- 
Steve
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/MVDPBRBONUQXJK2RW5VX24YCGD4NX3EM/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to