On Fri, Jul 26, 2019 at 10:13:45AM +0300, Batuhan Taskaya wrote:
> I am proposing namespace context managers with implementing `__enter__` and
> `__exit__` on dict objects. It would make closures possible in python with
> a pythonic syntax.
I don't understand what you mean here. Closures are already possible in
Python with a pythonic syntax.
> a = 4
> namespace = {}
>
> with namespace:
> a = 3
>
> assert a == 4
> assert namespace["a"] == 3
I have long wanted namespaces in Python, but I don't like the above. I
would prefer to see something like this:
a = 4
with Namespace("ns") as ns:
a = 3
print(a) # prints "3", not "4"
def func():
return a # Closes on ns.a, not global a
assert isinstance(ns, types.ModuleType)
assert ns.name = "ns"
assert ns.func() == 3
assert a == 4
Our standard namespace is the module, which is great for
small libraries and scripts. When your needs are greater (too much code
to comfortably co-exist in a single file), you can use a package.
But when your needs are lower, and a seperate .py file is too
heavyweight, we don't have anything convenient for a seperate namespace.
You can build a module object by hand:
from types import ModuleType
ns = ModuleType("ns")
ns.a = 3
def func():
return ns.a
ns.func = func
but it's not pretty code, its not convenient, and closures and name
lookups don't work or look right. You can use a class instead, but again
closures don't work right, and it is surprising to use a class object
without instantiating it.
I think a namespace context manager that created and populated a new
module (or subclass of module) object would fit this use-case nicely.
Use-case summary:
You have a collection of classes, functions and variables which should
live together in a namespace, seperate from the rest of your classes
etc, but you don't want to push them out into a seperate .py file.
--
Steven
_______________________________________________
Python-ideas mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at
https://mail.python.org/archives/list/[email protected]/message/YUMYJFTWWGUXPCFUFQV2O5AO4UU53X7Y/
Code of Conduct: http://python.org/psf/codeofconduct/