2

私はこのようなことをしようとしていました:

module.py

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

test.py

import module
print module['Monty']

「MontyPython」が印刷されることを期待していました。ただし、これは機能しません。

TypeError: 'module' object is not subscriptable 

純粋なPythonで(つまり、ソースコードやモンキーパッチなどを変更せずに)サブスクリプト可能なモジュールを作成することは可能ですか?

4

1 に答える 1

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

ModModule(globals()) を使用して、sys の現在のモジュールを置き換えることができます。

于 2012-05-03T20:40:32.273 に答える