I have no idea if this is a good idea, but Python already has modules to be namespaces for a collection of functions and values.

And while a class decorator is *supposed* to return a class, it can, in fact, return anything. So you can make a decorator that converts a class definition to a module object:

In [47]: def make_mod(cls):
    ...:     mod = imp.new_module(cls.__name__)
    ...:     for name, attr in vars(cls).items():
    ...:         if not name.startswith("_"):
    ...:             setattr(mod, name, attr)
    ...:     return mod
    ...:

In [48]: @make_mod
    ...: class Fake:
    ...:     an_attribute = "this"
    ...:     def a_function(a,b):
    ...:         print("a_function:", a, b)
    ...:

In [49]: Fake.an_attribute
Out[49]: 'this'

In [50]: Fake.a_function(3, 4)
a_function: 3 4

In [51]: type(Fake)
Out[51]: module

In [52]: vars(Fake)
Out[52]:
{'__name__': 'Fake',
 '__doc__': None,
 '__package__': None,
 '__loader__': None,
 '__spec__': None,
 'an_attribute': 'this',
 'a_function': <function __main__.Fake.a_function(a, b)>}

I expect this will give your functions a very odd globals()  though ;-)

But this made me think -- we already have modules, so if we do want a "namespace" type of some sort, why not simply have syntax for making a module inline:

new_module:
    def this():
        pass
    x = 4

It would be kind of nice to be able to make anew module without having to have an actual file (or fake one)

-CHB





-CHB








On Tue, Oct 6, 2020 at 11:02 PM Greg Ewing <greg.ewing@canterbury.ac.nz> wrote:
On 7/10/20 2:45 pm, Random832 wrote:
> I think the feature should allow for the functions to directly access
> each other from the namespace's scope without requiring an attribute
> lookup.

That got me thinking, and I came up with this:

def submodule(f):
   return type(f.__name__, (), f())

@submodule
def Stuff():

   def f1():
     print("First function")
     f2()

   def f2():
     print("Second function")

   return locals()

Stuff.f1()

The only ugly part is the need for the 'return locals()', but that could
probably be alleviated with a bit of bytecode hacking.

--
Greg
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-leave@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/KCUWQDLCNUHAP47DR7L3AJPBPI6H64LM/
Code of Conduct: http://python.org/psf/codeofconduct/


--
Christopher Barker, PhD

Python Language Consulting
  - Teaching
  - Scientific Software Development
  - Desktop GUI and Web Development
  - wxPython, numpy, scipy, Cython