Python: индекс модуля

Я пытался сделать что-то вроде этого:

module.py

<code>def __getitem__(item):
    return str(item) + 'Python'
</code>

test.py

<code>import module
print module['Monty']
</code>

Я ожидал, что "MontyPython" быть напечатанным. Однако это не работает:

<code>TypeError: 'module' object is not subscriptable 
</code>

Можно ли создать подписной модуль на чистом Python (то есть без изменения его исходного кода, установки обезьян и т. Д.)?

 cobie03 мая 2012 г., 22:37
почему ты хочешь это сделать?
 cobie03 мая 2012 г., 23:08
Я не думаю, что крутость стоит усилий. Просто продолжайте сdot синтаксис. На мой взгляд, это намного лучше.
 Pastafarianist03 мая 2012 г., 23:05
Я пишу приложение, которому нужен доступ к определенному глобальному состоянию из разных мест. Я думал, что было бы здорово иметь что-то вроде:import state; state[something_specific] = new_stuff чемfrom state_class import state; ...

Ответы на вопрос(1)

Решение Вопроса
>>> class ModModule(object):
    def __init__(self, globals):
        self.__dict__ = globals
        import sys
        sys.modules[self.__name__] = self
    def __getitem__(self, name):
        return self.__dict__[name]


>>> m = ModModule({'__name__':'Mod', 'a':3})
>>> import Mod
>>> Mod['a']
3

# subclassing the actual type won't work
>>> class ModModule(types.ModuleType):
    def __init__(self, globals):
        self.__dict__ = globals
        import sys
        sys.modules[self.__name__] = self
    def __getitem__(self, name):
        return self.__dict__[name]


>>> m = ModModule({'__name__':'Mod', 'a':3})

Traceback (most recent call last):
  File "<pyshell#114>", line 1, in <module>
    m = ModModule({'__name__':'Mod', 'a':3})
  File "<pyshell#113>", line 3, in __init__
    self.__dict__ = globals
TypeError: readonly attribute

ля в sys.

Ваш ответ на вопрос