python:defaultdict,带有非默认参数

时间:2014-09-20 18:22:56

标签: python dictionary karma-runner defaultdict

我希望有一个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。所以欢迎任何其他建议; - )

1 个答案:

答案 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>}