On Sat, Dec 23, 2017, 09:23 William Rose, <[email protected]> wrote:
> I had an idea that it could be helpful to have local functions as
> well as normal ones. They would be called the same way as normal
> ones but def would be replaced by internal and inside they could
> only access variables they have defined and inputs to them so no
> global variables or class variables. I think this could be used
> to save people accidentally changing variables you dont' want to
> change when updating your code. Let me know what you think!
I suspect you misunderstand how variables (actually, name bindings)
work in Python. If you do understand, I don't understand what you're
guarding against. With current semantics, code inside a function
cannot change a global binding, although it can refer to one:
>>> def f():
... x=3
... return x
...
>>> def g():
... return x
...
>>> x = 0
>>> y = f() # Changes x?
>>> z = g()
>>> print("x =", x, "y =", y, "z =", z)
x = 0 y = 3 z = 0 # Nope.
>>> def h():
... y = x + 5
... x = y # Changes x?
... return x
...
>>> w = h() # Nope, it crashes your program instead!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in h
UnboundLocalError: local variable 'x' referenced before assignment
You *can* use the global and nonlocal declarations to override the
normal automatic assumption that names are local to the scope in
which they are bound:
>>> def a():
... global x
... x = 42
... return x
...
>>> a()
42
>>> x
42
Prohibiting this last would be un-Pythonic, IMO (violates the
"consenting adults" principle). Similarly for class variables, which
can only be accessed using attribute notation. There are also
conventions, prefixing "_" or "__", which indicate "this is private,
mess with it at your own risk", and actually munge the name internally
to make it impossible to access accidentally (including in derived
classes).
_______________________________________________
Python-ideas mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/