Namespaces are one honking great idea
Ethan Furman
ethan at stoneleaf.us
Fri Jul 1 12:00:44 EDT 2016
On 07/01/2016 07:13 AM, Steven D'Aprano wrote:
I like the idea, but I have a couple questions about the design choices.
Comments below.
> The Zen of Python says:
>
> Namespaces are one honking great idea -- let's do more of those!
> Proposal
> =========
>
> Add a new "namespace" object to Python.
> Proof of concept
> =================
>
> Here's a proof of concept. I use a class with a custom metaclass like this:
>
>
> # Python 3 version
> class ExampleNS(metaclass=Namespace):
> x = 1
> y = []
>
> def spam(n):
> return 'spam'*n
>
> z = spam(3).upper()
>
> def ham(n):
> return spam(n).replace('sp', 'H')
>
> def test():
> global x
> x += 1
> y.append(1)
> return x, y
>
> Despite the "class" statement (a limitation of Python's lack of dedicated
> syntax for namespaces), the Example namespace behaves like (in fact, *is*)
> a module embedded inside a module.
So the idea is to have several "mini-modules" inside a single file?
Can a mini-module function access a different mini-module's function?
Can a mini-module function access/interact with the module's global scope?
> Especially note that inside the namespace, the global statement makes a name
> refer to the namespace scope.
Interesting. :)
> Unresolved questions
> =====================
>
> Would a decorator be better than a metaclass?
I think a decorator may provide more of a clue that something
interesting is happening -- whether a decorator is feasible depends on
whether you need the __prepare__ magic of metaclasses.
> @namespace
> class Example:
> ...
I believe Python already has a NameSpace type, so a different name is
probably better. How about minimodule? ;)
> Some limitations
> =================
>
> The simplified implementation shown doesn't allow functions inside the
> namespace to access names outside of the namespace easily.
How not-easy is it?
> In practice, the
> user might want the name resolution order inside the namespace to be:
>
> local variables
> nonlocal variables
> namespace globals
> module globals
> builtins
That would be ideal, I think. How close can we get to that?
> The biggest limitation is that I have to abuse the class statement to do
> this. In an ideal world, there would be syntactic support and a keyword:
>
> namespace Example:
> x = 0
> y = []
> def test(n): ...
>
> although others might argue that *not* needing a dedicated keyword is, in
> fact, better.
Metaclasses for the win!
> Disadvantages
> ==============
>
> Those unfamiliar with the namespace concept may be confused by a class that
> doesn't get instantiated.
A well-named decorator/base-class should help with that.
Did you mean for this to go to -Ideas?
--
~Ethan~
More information about the Python-list
mailing list