On 2018-04-29 07:57, Tim Peters wrote:
[Tim Delaney
] My big concern here involves the:
if local(m = re.match(regexp, line)): print(m.group(0))
example. The entire block needs to be implicitly local for that to work - what happens if I assign a new name in that block?
[Tim Peters]
I really don't know what you're asking there. Can you make it concrete? If, e.g., you're asking what happens if this appeared after the `print`:
x = 3.14
then the answer is "the same as what would happen if `local` had not been used". We can't know what that is without context, though. Maybe x is global. Maybe x was declared nonlocal earlier. Maybe it's function-local. ...
[Tim D]
That's exactly what I was asking, and as I understand what you're saying, we would have a local name m available in the indented block which went away when the block ended, but any names modified in the block are not local to the block. That seems likely to be a source of errors.
If you what you _want_ is a genuinely new scope, yes. But no actual use cases so far wanted that at all.
This is the kind of code about which there have been background complaints "forever":
m1 = regexp1.match(line) m2 = regexp2.match(iine) if m1 and m2: do all sorts of stuff with m1 and/or m2, including perhaps modifying local variables and/or global variables and/or nonlocal variables
The complaints are of two distinct kinds:
1. "I want to compute m1 and m2 _in_ the `if` test".
2. "I don't want these temp names (m1 and m2) accidentally conflicting with local names already in scope - if these names already exist, I want the temp names to shadow their current bindings until the `if` structure is done".
So,
if local(m1=regexp1.match(line), m2 = regexp2.match(iine), m1 and m2):
intends to address both complaints via means embarrassingly obvious to the most casual observer ;-)
How about these: local m1, m2: m1 = regexp1.match(line) m2 = regexp2.match(line): if m1 and m2: ... local m1, m2: if (m1 := regexp1.match(line)) and (m2 := regexp2.match(line)): ... local m1=regexp1.match(line), m2=regexp2.match(line): if m1 and m2: ... ? [snip]