I remain -1 on the PEP, but thank you very much Chris for the great work
writing it and the extra clarifications in it.
The part I like most about the proposal is the use in blocks, like:
if (re.match(...) as m):
print(m.groups(0))
if (input("> ") as cmd):
def run_cmd(cmd=cmd): # Capture the value in the default arg
print("Running command", cmd) # Works
But what I like has nothing much to do with scope limitation. It is only
about the idea of introducing a variable into a block. We can do that with
a context manager. No, there's no cleanup of the namespace in a
straightforward approach, but using e.g. `_x` as a convention for names
meant to be transient is already established practice and requires no
special syntax.
So right now, I can do these:
class bind(object):
def __init__(self, *args):
self.args = args
def __enter__(self):
return self.args[0] if len(self.args)==1 else self.args
def __exit__(self, *args):
pass
>>> with bind(sqrt(2)) as _a:
... print(_a)
1.4142135623730951
>>> with bind(sqrt(2), log(2)) as (a, b):
... print(a, b, a+b)
1.4142135623730951 0.6931471805599453 2.1073607429330403
This would cover 98% of the cases that I would want with the proposed
statement-local name bindings.
I suppose I could write something much more obscure that poked into the
call stack and actually deleted names from scopes in the context manager.
But really I rarely care about the temporary use of a few names, especially
if the same few temporary names are used repeatedly for these things.
On Fri, Mar 2, 2018 at 8:04 AM, Chris Angelico <[email protected]> wrote:
> On Sat, Mar 3, 2018 at 1:53 AM, Rhodri James <[email protected]> wrote:
> > On 02/03/18 11:43, Chris Angelico wrote:
> >>
> >> After dozens of posts and a wide variety of useful opinions and
> >> concerns being raised, here is the newest version of PEP 572 for your
> >> debating pleasure.
> >
> >
> > I haven't said this yet, so thanks Chris for putting this all together.
> Even
> > if the result is a rejected PEP, at least we have everything in one
> place.
>
> No problem. And I agree, a rejected PEP is still a successful result here.
>
> (Am I going to get a reputation for captaining dead PEPs?)
>
> >> # Compound statements usually enclose everything...
> >> if (re.match(...) as m):
> >> print(m.groups(0))
> >> print(m) # NameError
> >
> >
> > This (and the equivalent in while loops) is the big win in the PEP, in my
> > opinion. The number of ugly loops I've had to write in Python because I
> > can't write "while (something_to_do() as event):"... +1 on this.
> >
> >> # Using a statement-local name
> >> stuff = [[(f(x) as y), x/y] for x in range(5)]
> >
> >
> > As Paul said, the asymmetry of this bothers me a lot. It doesn't read
> > naturally to me. -1 on this.
>
> Interesting. I fully expected to get a lot more backlash for the
> if/while usage, but a number of people are saying that that's the only
> (or the biggest) part of this proposal that they like.
>
> ChrisA
> _______________________________________________
> Python-ideas mailing list
> [email protected]
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
--
Keeping medicines from the bloodstreams of the sick; food
from the bellies of the hungry; books from the hands of the
uneducated; technology from the underdeveloped; and putting
advocates of freedom in prisons. Intellectual property is
to the 21st century what the slave trade was to the 16th.
_______________________________________________
Python-ideas mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/