[英]SyntaxError: non-default argument follows default argument in python
[英]python: defaultdict with non-default argument
我希望有一個class TestClass
的dict
,它有一個非默認參數。 當我訪問時,我不知道所要求的元素是否已經出現過。 所以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.