当前位置:  开发笔记 > 编程语言 > 正文

Python-使用defaultdict制作自定义对象的字典

如何解决《Python-使用defaultdict制作自定义对象的字典》经验,为你挑选了1个好方法。

我创建了以下课程。包,网站和注释都是字符串,而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, in 
    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 
    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)

Ulf Aslak.. 5

当您尝试从defaultdict获取某些内容时,它会返回default_factory您实例化它的实例,在您的情况下,该实例TableEntry没有method append。但这实际上不是为什么您会得到此错误。发生这种情况的原因是,返回实例时也会对其进行评估,并且由于TableEntry没有所需的参数,因此Python解释器会抱怨。但是,即使TableEntrydefaultdict调用中被提供了参数,您也可能会得到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



1> Ulf Aslak..:

当您尝试从defaultdict获取某些内容时,它会返回default_factory您实例化它的实例,在您的情况下,该实例TableEntry没有method append。但这实际上不是为什么您会得到此错误。发生这种情况的原因是,返回实例时也会对其进行评估,并且由于TableEntry没有所需的参数,因此Python解释器会抱怨。但是,即使TableEntrydefaultdict调用中被提供了参数,您也可能会得到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

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有