[Python-ideas] If branch merging
Andrew Barnert
abarnert at yahoo.com
Fri Jun 12 20:41:28 CEST 2015
On Jun 12, 2015, at 11:25, Ron Adam <ron3200 at gmail.com> wrote:
>
>> On 06/12/2015 01:21 PM, Ethan Furman wrote:
>>> On 06/12/2015 08:14 AM, Stephen J. Turnbull wrote:
>>> Ethan Furman writes:
>>>
>>>> Likewise:
>>>>
>>>> for val in some_iterator:
>>>> use(val)
>>>>
>>>> bar(val)
>>>>
>>>> will shadow foo.val
>>>
>>> Yes, I understand that. What I don't understand is your statement
>>> that you would like "if expr as val:" if it *doesn't* shadow.
>>
>> Ah, I think I see your point. My use of the word "shadow" was in relation
>> to the micro-scope and the previously existing name being shadowed and then
>> un-shadowed when the micro-scope was destroyed. If we are at module-level
>> (not class nor function) then there should be no shadowing, but a rebinding
>> of the name. Even try/except blocks don't "shadow", but rebind and then
>> delete the name used to catch the exception.
>
> The problem can be turned around/over. Instead of specifying a name to be shadowed, the names to be shared can be specified. Then it translates to function with specified nonlocals.
I really like making it explicit.
I'm not sure about the turning-it-around bit. That means inside a with-nonlocal block, things don't work the same as in any another block, and that won't be at all obvious.
But even without that, the idea works; to make something nested-local, you write:
with local b:
for b in some_iterator:
a = use(b)
That leaves function-local as the default, and defines statement-local in a way that's as similar as possible to the other alternatives, environment-nonlocal and global; the only real difference is that it has a suite, which is pretty much implicit in the fact that it's defining something as local to the suite.
Either way seems better than the quasi-magic scoping (both my version and Nick's took a couple paragraphs to explain...) caused by as expressions and/or clauses. And that's in addition to the advantages you suggested of not complicating the syntax and keeping separate concepts separate.
> I like this better, but am still -0.5. I'd need to see some examples where it would be "worth it". It still feels like a solution looking for a problem to me.
Agreed. I think everyone (including myself) has put thought into this just because it's an interesting puzzle, not necessarily because the language needs it...
More information about the Python-ideas
mailing list