我创建了以下类。包,网站和评论都是字符串,而distroDict是一个(字符串,列表)字典。
class TableEntry(object):
def __init__(self, package, website, distroDict, comments):
self.package = package
self.website = website
self.distroDict = distroDict
self.comments = comments
我想使用defaultdict(TableEntry)创建一个(string,TableEntry)自定义词典。
tableDict = defaultdict(TableEntry)
entry = TableEntry(package, website, distroDict, comments)
tableDict[package].append(entry)
我希望包是键,输入对象是值。我可以在条目对象中使用值,但如果我尝试将其附加到tableDict,则会收到以下错误。
Traceback (most recent call last):
File "wiki.py", line 151, in <module>
printMetaData(lines, f)
File "wiki.py", line 73, in printMetaData
tableDict[package].append(entry)
TypeError: __init__() takes exactly 5 arguments (1 given)
我也尝试了以下内容:
tableDict[package].append(TableEntry(package, website, distroDict, comments))
并且基本上收到相同的错误:
Traceback (most recent call last):
File "wiki.py", line 150, in <module>
printMetaData(lines, f)
File "wiki.py", line 73, in printMetaData
tableDict[package].append(TableEntry(package, website, distroDict, comments))
TypeError: __init__() takes exactly 5 arguments (1 given)
答案 0 :(得分:4)
当您尝试从defaultdict获取某些内容时,它会返回您实例化的default_factory
实例,在您的情况下,TableEntry
没有方法append
。但这实际上不是你得到错误的原因。发生这种情况是因为当返回一个实例时,它也会被评估,并且由于TableEntry
没有它需要的参数,Python解释器会抱怨。但即使在TableEntry
调用中给defaultdict
个参数,你也可能得到一个TypeError
,因为defaultdict
需要用一个可调用的调用(而不是一个实例)类,因为它会。)
总之,您无法使用不可调用的unless you use subclassing实例化defaultdict。相反,你应该做这样的事情:
class TableEntry(object):
def add(self, package, website, distroDict, comments):
self.package = package
self.website = website
self.distroDict = distroDict
self.comments = comments
tableDict = defaultdict(TableEntry)
entry = ("package", "website", "distroDict", "comments")
tableDict["package"].add(*entry)
然后你可以做,例如tableDict["package"]["website"]
获取您写入self.website
的字符串。