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~

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to