我创建了以下课程。包,网站和注释都是字符串,而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)制作(字符串,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, inprintMetaData(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, inprintMetaData(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)
Ulf Aslak.. 5
当您尝试从defaultdict获取某些内容时,它会返回default_factory
您实例化它的实例,在您的情况下,该实例TableEntry
没有method append
。但这实际上不是为什么您会得到此错误。发生这种情况的原因是,返回实例时也会对其进行评估,并且由于TableEntry
没有所需的参数,因此Python解释器会抱怨。但是,即使TableEntry
在defaultdict
调用中被提供了参数,您也可能会得到a,TypeError
因为defaultdict
需要使用可调用对象(而不是类的实例)来调用它。
总而言之,除非使用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
。
当您尝试从defaultdict获取某些内容时,它会返回default_factory
您实例化它的实例,在您的情况下,该实例TableEntry
没有method append
。但这实际上不是为什么您会得到此错误。发生这种情况的原因是,返回实例时也会对其进行评估,并且由于TableEntry
没有所需的参数,因此Python解释器会抱怨。但是,即使TableEntry
在defaultdict
调用中被提供了参数,您也可能会得到a,TypeError
因为defaultdict
需要使用可调用对象(而不是类的实例)来调用它。
总而言之,除非使用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
。