Is there a way to get __thismodule__?

Jeff McNeil jeff at jmcneil.net
Wed Mar 19 00:31:49 EDT 2008


This is somewhere that I would personally use a metaclass. That way,
if you define more subclasses of Message, you're not limited to doing
so in that single module.

Someone correct me if this is goofy, I don't do much metaclass programming.

Perhaps something like:

#!/usr/bin/python

class MetaMessage(type):
    nmap = {}
    def __new__(mcl, name, bases, d):
        obj = super(MetaMessage, mcl).__new__(mcl, name, bases, d)

        # Check __name__ here as 'Message' isn't yet defined.
        if "Message" in [b.__name__ for b in bases]:
            if "number" not in d:
                raise TypeError("Message protocol expects a number attribute")
            MetaMessage.nmap[d['number']] = obj

        # Complete Creation.
        return obj

class Message(object):
    __metaclass__ = MetaMessage

class MessageOne(Message):
    number = 1

class MessageTwo(Message):
    number = 2

class MessageFourThousandThreeHundredAndTwentyTwoPointOne(Message):
    number = 4322.1

print MetaMessage.nmap

Which results in:
mac:~ jeff$ !p
python test.py
{1: <class '__main__.MessageOne'>, 2: <class '__main__.MessageTwo'>,
4322.1000000000004: <class
'__main__.MessageFourThousandThreeHundredAndTwentyTwoPointOne'>}
mac:~ jeff$

Thanks!

Jeff

On 3/19/08, benhoyt <benhoyt at gmail.com> wrote:
>
>  Replying to myself here, after discovering more. :-)
>
>
>  > Is there a way to get __thismodule__ in Python?
>
>
> It looks like __thismodule__ is just sys.modules[__name__]. Neat.
>
>  Hmmm ... does sys.modules always already contain the currently-being-
>  loaded module? Or is this a hack that only happens to work? (It does;
>  I've tested it now.) Just wondering, because the Python docs say that
>  sys.modules is "a dictionary that maps module names to modules which
>  have *already been loaded*."
>
>
>  > if isinstance(attr, Message):
>  >     nmap[attr.number] = attr
>
>
> Oops, this was untested code. I actually meant issubclass (or
>  something similar) here, not isinstance.
>
>
>  Cheers,
>  Ben.
>  --
>  http://mail.python.org/mailman/listinfo/python-list
>



More information about the Python-list mailing list