Python: subíndice de un módulo

Estaba tratando de hacer algo como esto:

módulo.py

def __getitem__(item):
    return str(item) + 'Python'

prueba.py

import module
print module['Monty']

Esperaba que se imprimiera "MontyPython". Sin embargo, esto no funciona:

TypeError: 'module' object is not subscriptable 

¿Es posible crear un módulo suscribible en Python puro (es decir, sin modificar su código fuente, parchear monos, etc.)?

preguntado el 03 de mayo de 12 a las 21:05

Estoy escribiendo una aplicación que necesita acceso a un determinado estado global desde varios lugares. Pensé que sería genial tener algo como: import state; state[something_specific] = new_stuff que from state_class import state; ... -

No creo que la frialdad valga la pena el esfuerzo. Solo sigue adelante con el punto sintaxis. En mi opinión es mucho más mejor. -

1 Respuestas

>>> 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

puede usar ModModule(globals()) para reemplazar el módulo actual en sys.

contestado el 03 de mayo de 12 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.