我希望有一个dict
的{{1}},它有一个非默认参数。当我访问时,我不知道所要求的元素是否已经存在。所以class TestClass
:
TestClass
然后是class TestClass(object):
def __init__(self, name):
self.name = name
self.state = 0
def getName(self):
self.state = self.state + 1
return "%s -- %i" % (self.name, self.state)
和访问功能:
dict
实际测试代码:
db = {}
def getOutput(key):
# this is a marvel in the world of programming langauges
if key not in db:
db[key] = TestClass(key)
return db[key]
尼斯。但我想知道是否有更优雅的解决方案。浏览,defaultdict进入我的脑海。但这不会起作用,因为我无法将论证传递给default_factory:
if __name__ == "__main__":
print "testing: %s" % getOutput('charlie').getName()
给from collections import defaultdict
d = defaultdict(TestClass)
print "testing %s" % d['tom'].getOutput()
...我还有另一个解决方案吗?
此外,我想改进我的Python。所以欢迎任何其他建议; - )
答案 0 :(得分:5)
defaultdict
工厂确实没有参与。
您可以创建自己的 变体;诀窍在于定义__missing__
方法:
class TestClassDict(dict):
def __missing__(self, key):
res = self[key] = TestClass(key)
return res
每当为不存在的dict[key]
访问key
时,都会调用__missing__
方法。 defaultdict
每次使用此挂钩返回factory()
,但您可以提供自己的挂钩并传入key
。
演示:
>>> class TestClass(object):
... def __init__(self, name):
... self.name = name
... self.state = 0
... def getName(self):
... self.state = self.state + 1
... return "%s -- %i" % (self.name, self.state)
...
>>> class TestClassDict(dict):
... def __missing__(self, key):
... res = self[key] = TestClass(key)
... return res
...
>>> db = TestClassDict()
>>> db['charlie'].getName()
'charlie -- 1'
>>> db
{'charlie': <__main__.TestClass object at 0x102f72250>}