簡體   English   中英

python:defaultdict,帶有非默認參數

[英]python: defaultdict with non-default argument

我希望有一個class TestClassdict ,它有一個非默認參數。 當我訪問時,我不知道所要求的元素是否已經出現過。 所以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]

和實際的測試代碼:

if __name__ == "__main__":
    print "testing: %s" % getOutput('charlie').getName()

尼斯。 但我想知道是否有更優雅的解決方案。 瀏覽, 默認的dict進入我的腦海。 但這不起作用,因為我無法將參數傳遞給default_factory

from collections import defaultdict
d = defaultdict(TestClass)
print "testing %s" % d['tom'].getOutput()

給出TypeError: __init__() takes exactly 2 arguments (1 given) ...我還有另一個解決方案嗎?

此外,我想改進我的Python。 所以歡迎任何其他建議;-)

defaultdict工廠確實沒有參數。

你可以創建自己的變種然而, ; 訣竅在於定義__missing__方法:

class TestClassDict(dict):
    def __missing__(self, key):
        res = self[key] = TestClass(key)
        return res

每當為不存在的key訪問dict[key]__missing__調用__missing__方法。 defaultdict每次使用此鈎子返回factory() ,但您可以提供自己的key並傳入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>}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM