[Python-ideas] making a module callable

Eric Snow ericsnowcurrently at gmail.com
Wed Nov 20 22:01:28 CET 2013


On Wed, Nov 20, 2013 at 1:23 PM, Ethan Furman <ethan at stoneleaf.us> wrote:
> On 11/20/2013 12:14 PM, Eric Snow wrote:
>> Sticking something into sys.modules to replace the currently executing
>> module is indeed a hack.  The import system accommodates this not by
>> design (unless someone is willing to come forward and admit guilt
>> <wink>) but mostly as an incidental implementation artifact of the
>> import machinery from many releases ago. [1]
>
>
> Actually, it is intentional.  An excerpt from
> https://mail.python.org/pipermail/python-ideas/2012-May/014969.html
>
>>  There is actually a hack that is occasionally used and recommended:
>>  a module can define a class with the desired functionality, and then
>>  at the end, replace itself in sys.modules with an instance of that
>>  class (or with the class, if you insist, but that's generally less
>>  useful). E.g.:
>>
>> # module foo.py
>>
>>   import sys
>>
>>   class Foo:
>>       def funct1(self, <args>): <code>
>>       def funct2(self, <args>): <code>
>>
>>   sys.modules[__name__] = Foo()
>>
>> This works because the import machinery is actively enabling this
>>  hack, and as its final step pulls the actual module out of
>>  sys.modules, after loading it. (This is no accident. The hack was
>>  proposed long ago and we decided we liked enough to support it in
>>  the import machinery.)

I stand corrected. :)

-eric


More information about the Python-ideas mailing list