Python3-使用defaultdict的递归错误 我在这里想要实现什么?

Python3-使用defaultdict的递归错误 我在这里想要实现什么?,python,python-3.x,recursion,defaultdict,Python,Python 3.x,Recursion,Defaultdict,我想读取目录中的每个.txt文件,并将它们存储到名为documents的defaultdict中。此defaultdict的键应该是文档的名称,其值应该是文档的内容。 请注意,一些.txt文件是同一文档的一部分(如新闻文章的不同页面):在这种情况下,如果文档已经存在于文档中,我希望能够更新文档并附加.txt文件的内容。 为此,我一直在实现这个类: class Document(object): ''' Could be an article, a letter, an interv

我想读取目录中的每个.txt文件,并将它们存储到名为documents的defaultdict中。此defaultdict的键应该是文档的名称,其值应该是文档的内容。

请注意,一些.txt文件是同一文档的一部分(如新闻文章的不同页面):在这种情况下,如果文档已经存在于文档中,我希望能够更新文档并附加.txt文件的内容。

为此,我一直在实现这个类:

class Document(object):
'''
    Could be an article, a letter, an interview or whatever
'''
    def __init__(self):
        self.name = None
        self.text = ''
        self.image = None

    @property 
    def name(self):
        return name

    @name.setter
    def name(self, name):
        self.name = name

    def append_text(self, text):
        self.text += ' ' + text

然后,我使用此函数遍历目录中的所有文件并创建defaultdict:

这里,parse_filename函数帮助我获取正在读取的文档的名称。函数read_text以字符串形式返回文档内容


当我在main.py中执行下面的行时

my_dir = 'path/to/directory'
documents = get_documents_from(my_dir)
我得到以下错误:

File "lda_TM.py", line 17, in <module>
documents = get_documents_from(my_dir)
  File "/path/to/main.py", line 36, in get_documents_from
documents[name].append_text(read_txt(filename))
  File "/path/to/main.py", line 32, in <lambda>
documents = defaultdict(lambda: Document())
  File "path/to/Document.py", line 8, in __init__
self.name = None
  File "path/to/Document.py", line 19, in name
self.name = name
  File "path/to/Document.py", line 19, in name
self.name = name
  File "path/to/Document.py", line 19, in name
self.name = name
  [Previous line repeated 491 more times]
RecursionError: maximum recursion depth exceeded
文件“lda_TM.py”,第17行,在
文档=从(我的目录)获取文档
文件“/path/to/main.py”,第36行,从中获取文档
文档[名称]。追加文本(读取文本(文件名))
文件“/path/to/main.py”,第32行,在
documents=defaultdict(lambda:Document())
文件“path/to/Document.py”,第8行,在_init中__
self.name=None
文件“path/to/Document.py”,第19行,名称
self.name=名称
文件“path/to/Document.py”,第19行,名称
self.name=名称
文件“path/to/Document.py”,第19行,名称
self.name=名称
[上一行重复了491次]
递归错误:超过最大递归深度

我真的不明白为什么我会犯这个错误。。。是因为类文档没有正确实现,还是因为我不能将自己的对象与defaultdict一起使用?

我知道我可以通过使用一个简单的dict并在每次遇到新名称时创建一个新文档(或者如果名称已经存在,则更新文档)来解决这个问题,但这似乎不是非常有效,而且有点不和谐。。。

另外,我知道创建一个defaultdict,将文档的名称用作键,并将一个对象文档(已嵌入相同名称)用作值,这可能看起来很奇怪。我只是想,如果我创建了一个文档列表而不是dict,我将被迫实现一个搜索功能来更新文档。使用defaultdict似乎效率更高(因为我会在读取所有文件后立即将其转换为列表)。

非常感谢您的帮助和建议!



William

您的类文档有一个属性
name
和一个属性
name
。第二个覆盖第一个

当您这样做时:

@property 
def name(self):
    return name
首先,我假设有一个输入错误,取而代之的是
返回self.name
,否则会出现
名称错误
。第二,您试图返回的是
name
的值,但现在
name
是属性,它反过来尝试返回
name
的值,依此类推


典型的解决方案是将属性称为
\u name
,这样它就不会被属性隐藏。

类文档有一个属性
name
和一个属性
name
。第二个覆盖第一个

当您这样做时:

@property 
def name(self):
    return name
首先,我假设有一个输入错误,取而代之的是
返回self.name
,否则会出现
名称错误
。第二,您试图返回的是
name
的值,但现在
name
是属性,它反过来尝试返回
name
的值,依此类推


典型的解决方案是将属性命名为类似于
\u name
,这样它就不会被属性隐藏。

有关正确命名的示例,请参见此答案:

self.name=name递归调用“name”属性

此代码正常工作:

@property 
def name(self):
    return self._name

@name.setter
def name(self, name):
    self._name = name

有关正确命名的示例,请参见此答案:

self.name=name递归调用“name”属性

此代码正常工作:

@property 
def name(self):
    return self._name

@name.setter
def name(self, name):
    self._name = name

您是否尝试将
文档[name].name=name
替换为
documents[name].name(name)
我刚刚尝试过,错误完全相同…请查看,谢谢您的回答!您是否尝试将
文档[name].name=name
替换为
documents[name].name(name)
我刚刚尝试过,错误完全相同…请查看,谢谢您的回答!谢谢你的回答!谢谢你的回答!谢谢你的回答!谢谢你的回答!