2012-05-03 17 views
0

添字:Pythonの:私はこのような何かやろうとしたモジュール

module.py

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

test.py

import module 
print module['Monty'] 

を私は "期待MontyPython "が印刷されます。しかし、これは動作しません:

TypeError: 'module' object is not subscriptable 

それは(すなわちなど、そのソースコード、猿パッチングを変更せずに)純粋なPythonでの添字モジュールを作成することは可能ですか?

+0

なぜそれをしたいですか? – cobie

+0

私は、さまざまな場所から特定のグローバル状態にアクセスする必要のあるアプリケーションを作成しています。私はそれが次のようなものを持つのはクールだと思った: 'import state; 状態[something_specific] = new_stuff' より 'from state_class import state; ... ' – Pastafarianist

+0

私は涼しさが努力の価値があるとは思わない。 *ドット*の構文に進むだけです。私の意見では、はるかに良いです。 – cobie

答えて

2
>>> 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の現在のモジュールを置き換えるのに、ModModule(globals())を使用できます。

関連する問題