关于Python:Python – 使用defaultdict创建自定义对象的字典

Python - Using defaultdict to make dictionary of custom objects

我创建了以下类。 包,网站和注释都是字符串,而distroDict是一个(字符串,列表)字典。

1
2
3
4
5
6
7
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)自定义字典。

1
2
3
tableDict = defaultdict(TableEntry)
entry = TableEntry(package, website, distroDict, comments)
tableDict[package].append(entry)

我希望包是键,输入对象是值。 我可以使用条目对象中的值,但如果我尝试将其附加到tableDict,我会收到以下错误。

1
2
3
4
5
6
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)

我也尝试过以下方法:

1
tableDict[package].append(TableEntry(package, website, distroDict, comments))

并且基本上收到相同的错误:

1
2
3
4
5
6
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)


当您尝试从defaultdict获取某些内容时,它会返回您实例化的default_factory实例,在您的情况下,TableEntry没有方法append。 但这实际上不是你得到错误的原因。 发生这种情况是因为当返回一个实例时,它也会被评估,并且由于TableEntry没有它需要的参数,Python解释器会抱怨。 但是即使defaultdictdefaultdict调用中给出了参数,你也可能得到一个TypeError,因为defaultdict需要用一个可调用的函数来调用(而不是一个类的实例,就像它一样)。

总之,除非使用子类,否则无法使用不可调用的方法实例化defaultdict。 相反,你应该做这样的事情:

1
2
3
4
5
6
7
8
9
10
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的字符串。