/ Published in: Python
The ASPN cookbook has many recipes for singletons in Python. So far, this one http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/412551 has been my favourite, because it is so simple and concise. However, I just ran into a brick wall when I tried to use it with a class that can be initialized with keyword arguments. This is my first draft for a solution to this problem. It's quick and dirty; please give it a glance and leave a comment if you find a problem.
Expand |
Embed | Plain Text
class Singleton(type): def __init__(self, *args, **kwds): type.__init__(self, *args, **kwds) self._instances = {} def __call__(self, *args, **kwds): sig = args + tuple(sorted(kwds.items())) if not sig in self._instances: self._instances[sig] = type.__call__(self, *args, **kwds) return self._instances[sig]
Comments
Subscribe to comments
You need to login to post a comment.

Thanks to Knio and Raumkraut from #pygame for helping me with making this concise and correct!
I just realized that this is probably good enough in practice if you merely want to avoid creating multiple instances for equivalent parameters, but not if you have to make absolutely sure that there are no duplicate instances (since potential keyword and positional arguments aren't disjoint sets). As it is, you can use appropriate coding conventions as a workaround.