[Python-ideas] Function-like Modules (better control/introspection)

C Anthony Risinger anthony at xtfx.me
Mon Mar 17 16:58:20 CET 2014


ok, let me try this again, sans distractions:

could we consider adding __code__ and __call__ to module objects? __code__
would contain the code executed in the module __dict__, and __call__ would
reload the module.

thoughts?

-- 

C Anthony


On Fri, Mar 14, 2014 at 4:03 PM, C Anthony Risinger <anthony at xtfx.me> wrote:

> hello,
>
> could we make modules work more like this...
>
> https://gist.github.com/xtfxme/9556806
>
> tl;dr: __code__ object available (potentially a __self__ object), reload
> by calling, makes working with modules more natural/safe!
>
> ENCLOSED: modules-next.py
>
> --
>
> C Anthony
>
> #----------------------------------------------------------------------------------------(
> modules-next.py )
> # encoding: utf-8
> #
> # modules-next
> #
> # C Anthony Risinger
>
>
> import sys
>
>
> m_name = 'modules_next'
> m_source = r"""\
> if __name__ == '{0}':
>     from . import __call__ as reexec
>     from . import __code__ as code
>     from . import __dict__ as ns
>     print('>>> {{0}}: {{1}}\n{{2}}\n'.format(__name__, code, ns.keys()))
>     __name__ = 'modules_next_reloaded'
>     reexec()
>     print('>>> {{0}}: {{1}}\n{{2}}\n'.format(__name__, code, ns.keys()))
> else:
>     print('!!! __name__ == {{0}}\n'.format(__name__))
>
>  def throw():
>     raise Exception(__name__)
> """.format(m_name)
> m_code = compile(m_source, m_name, 'exec')
> m_dict = {
>     '__file__': __file__ + '.next',
>     '__name__': m_name,
>     '__path__': list(),
>     '__doc__': None,
>     }
> #...bind namespace/functions
> module = eval('lambda: None', m_dict)
> #...automatically expose as attributes
> module.__dict__ = module.__globals__
> #...must be set twice, __code__ sees __dict__, but we see descriptor
> module.__name__ = m_name
> #...redefine the function body!
> module.__code__ = m_code
> #...yay! we haz legitimate module!
> sys.modules[m_name] = module
>
>
> print('--* importing...')
> import modules_next
> print('>>> {0}: {1}\n{2}\n'.format(
>     __name__,
>     modules_next.__code__,
>     modules_next.__dict__.keys(),
>     ))
>
> print('--* importing (for real this time)...')
> #...import/reload by calling our func-y-module
> module()
> print('>>> {0}: {1}\n{2}\n'.format(
>     __name__,
>     modules_next.__code__,
>     modules_next.__dict__.keys(),
>     ))
>
>
> print('--* throwing...')
> modules_next.throw()
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20140317/0550a789/attachment.html>


More information about the Python-ideas mailing list