Nathaniel Smith <n...@pobox.com> added the comment:

@Nick:
> We're OK with the idea that installing a trace function might automatically 
> turn off various compiler and interpreter managed optimisations

We're OK with assigning to locals() doing that too.

> What we're aiming to avoid is requiring that implementations make the 
> assertion in "a = 1; locals('a') = 2; assert a == 2" pass at function scope, 
> and if anything, we'd prefer to make it a requirement for that assertion to 
> *fail*.

Why do you want it to fail? Given that it's already guaranteed to pass in some 
scopes (definitely in CPython, I'm not sure if it's in the language spec), and 
that we need to support mutations of f_locals for debugging, then this seems 
like a quixotic requirement. But if we do want it to fail, then we should make 
it fail obviously, e.g. by having locals() return a read-only mapping that 
raises an exception on mutation.

The only rationale I can understand here is the desire to leave options open 
for alternative implementations... but in practice all those alternative 
implementations can either support this just fine (because they have to to 
support pdb), or else they're MicroPython and have already stopped supporting 
locals() entirely so it hardly matters how CPython tweaks the details of the 
semantics.

> Requiring locals to actually *be* a write-through proxy (for all locals, not 
> just cell references) would revert Python's semantics to the state they were 
> in before the "fast locals" concept was first introduced, and we have no 
> intention of going back there.

Why not? I don't think anyone has ever suggested that "fast locals" made 
Python's *semantics* simpler.

@Armin:
> Perhaps more importantly, I am sure that if Python starts supporting random 
> mutation of locals outside tracing hooks, then it would open the door to 
> various hacks that are best not done at all, from a code quality point of 
> view.

I'm not saying that assigning to locals() is great style, but there are totally 
legitimate use cases (debugging), and there's nothing stopping those hacks 
right now. You *can* use tracing hooks, or there's this nonsense: 
https://gist.github.com/njsmith/2347382

Once Python commits to supporting something, then generally it exposes it in a 
pretty straightforward way; it's really unusual to put the feature in a 
non-obvious place and then make the obvious way subtly broken to punish people 
who try to use it.

@Nick
> - when do we update ordinary local variables? (this isn't broken, so we want 
> to avoid changing it)

But as pointed out earlier in this thread, pdb's support for updating ordinary 
local variables *is* currently broken, and would be fixed by using a 
write-through proxy for f_locals: https://bugs.python.org/issue30744#msg297480

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue30744>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to