私は通常、次のようなオブジェクト プールを作成することで、この問題に取り組みます。
>>> class Pool:
from collections import namedtuple, defaultdict, OrderedDict
namespace = defaultdict(OrderedDict)
@staticmethod
def add(ns='default', **kwargs):
Pool.namespace[ns].update(kwargs)
@staticmethod
def pop(ns='default', *args):
return [Pool.namespace[ns].pop(k) for k in args]
@staticmethod
def remove(ns):
if ns == 'default':
raise AttributeError
del Pool.namespace[ns]
@staticmethod
def get(ns='default', **kwargs):
if kwargs:
return namedtuple(ns,kwargs.keys())(Pool.namespace[ns][k] for k in kwargs)
else:
return namedtuple(ns,Pool.namespace[ns].keys())(*Pool.namespace[ns].values())
@staticmethod
def ns():
return Pool.namespace.keys()
@staticmethod
def purge():
Pool.namespace = defaultdict(OrderedDict)
>>> Pool.add('NS1',F=10,G=20)
>>> Pool.add('NS2',A=1,B=2)
>>> Pool.pop('NS1')
[]
>>> Pool.pop('NS1','F')
[10]
>>> Pool.get('NS1')
NS1(G=20)
>>> Pool.add(X=100,Y=200)
>>> Pool.ns()
['', 'NS1', 'NS2']
>>> Pool.remove('NS1')
>>> Pool.ns()
['', 'NS2']
>>> def sci():
Pool.add("sci",F=20,G=30)
>>> def ci():
ns_sci = Pool.get("sci")
print ns_sci.F, ns_sci.G
>>> sci()
>>> ci()
20 30
>>>
グローバル名前空間を汚染することなく、関数またはモジュール全体でこれを使用できるようになりました。複数の名前空間が共存できるように、名前空間全体に分散することもできます。