Python class: 数据不知何故丢失
Python class: The data is somehow lost
我正在尝试定义一个 Python class,它通过 praw 包分析 subreddit 数据。
我对 C++ 中的 OOP 相当有经验,但对 Python 中的 OOP 经验不多。这是我到目前为止的代码:
import praw
class SubRedditAnalyzer:
def __init__(self, reddit_session, name='dataisbeautiful'):
self.name = name # subreddit name
self.reddit_session = reddit_session # assign the reddit session
self.subreddit = self.reddit_session.get_subreddit(self.name) # create the subreddit object
self.timeframe = 'day'
self.max_post_count = 10
self.submissions = self.subreddit.get_top_from_hour(limit=10)
def __del__(self):
class_name = self.__class__.__name__
print class_name, "destroyed"
def get_top_submissions(self, max_post_count):
timeframe = self.timeframe
if (timeframe == 'hour'):
self.submissions = self.subreddit.get_top_from_hour(limit= max_post_count)
elif (timeframe == 'day'):
self.submissions = self.subreddit.get_top_from_day(limit= max_post_count)
elif (timeframe == 'week'):
self.submissions = self.subreddit.get_top_from_week(limit= max_post_count)
elif (timeframe == 'month'):
self.submissions = self.subreddit.get_top_from_month(limit= max_post_count)
elif (timeframe == 'year'):
self.submissions = self.subreddit.get_top_from_year(limit= max_post_count)
elif (timeframe == 'all'):
self.submissions = self.subreddit.get_top_from_all(limit= max_post_count)
def combine_titles(self):
titles = ""
for submission in self.submissions:
titles += submission.title
self.titles = titles
def display_titles(self):
counter = 1
ya = self.submissions
for sub in self.submissions:
sc = sub.score
ti = sub.title
print('T%d- [%d] %s \n' %(counter,sc,ti))
counter += 1
def main():
r = praw.Reddit('Request to fetch data by user')
sr = SubRedditAnalyzer(r, 'dataisbeautiful')
sr.get_top_submissions(15) # top 15 from reddit
sr.combine_titles() # combine the top titles
sr.display_titles() # display all the titles
main()
由于某些(对我而言)未知的原因,class 'sr' 中的数据似乎在调用
后丢失了
sr.combine_titles()
当我尝试调用此方法时,class 中的数据为空:
sr.display_titles()
事实上,我确实看到 class 被销毁的消息:
SubRedditAnalyzer 已销毁
我做错了什么?
预先感谢您的关注。
似乎 self.submissions
可能是可迭代的但不是集合(例如列表)。 The docs call get_top_from_hour()
a generator method (although they state also that what is returned is a list...). If it is indeed a generator method,结果只能迭代一次。所有其他迭代尝试都将无声地失败(display_titles()
中的循环不执行任何操作)。
所以,解决方案是:
self.submissions = list(self.subreddit.get_top_from_hour(limit=10))
在 __init__()
中将可迭代对象转换为可迭代多次的永久集合(列表)。
根据 PRAW 文档,get_content
及其相关方法如 get_top_from_hour
return a generator。生成器只能迭代一次,您在 combine_titles
中进行了迭代。该次迭代后,生成器耗尽,无法再次迭代。
当您在 __init__
:
中获取提交时,您大概可以将它们转换为列表
self.submissions = list(self.subreddit.get_top_from_hour(limit=10))
我正在尝试定义一个 Python class,它通过 praw 包分析 subreddit 数据。
我对 C++ 中的 OOP 相当有经验,但对 Python 中的 OOP 经验不多。这是我到目前为止的代码:
import praw
class SubRedditAnalyzer:
def __init__(self, reddit_session, name='dataisbeautiful'):
self.name = name # subreddit name
self.reddit_session = reddit_session # assign the reddit session
self.subreddit = self.reddit_session.get_subreddit(self.name) # create the subreddit object
self.timeframe = 'day'
self.max_post_count = 10
self.submissions = self.subreddit.get_top_from_hour(limit=10)
def __del__(self):
class_name = self.__class__.__name__
print class_name, "destroyed"
def get_top_submissions(self, max_post_count):
timeframe = self.timeframe
if (timeframe == 'hour'):
self.submissions = self.subreddit.get_top_from_hour(limit= max_post_count)
elif (timeframe == 'day'):
self.submissions = self.subreddit.get_top_from_day(limit= max_post_count)
elif (timeframe == 'week'):
self.submissions = self.subreddit.get_top_from_week(limit= max_post_count)
elif (timeframe == 'month'):
self.submissions = self.subreddit.get_top_from_month(limit= max_post_count)
elif (timeframe == 'year'):
self.submissions = self.subreddit.get_top_from_year(limit= max_post_count)
elif (timeframe == 'all'):
self.submissions = self.subreddit.get_top_from_all(limit= max_post_count)
def combine_titles(self):
titles = ""
for submission in self.submissions:
titles += submission.title
self.titles = titles
def display_titles(self):
counter = 1
ya = self.submissions
for sub in self.submissions:
sc = sub.score
ti = sub.title
print('T%d- [%d] %s \n' %(counter,sc,ti))
counter += 1
def main():
r = praw.Reddit('Request to fetch data by user')
sr = SubRedditAnalyzer(r, 'dataisbeautiful')
sr.get_top_submissions(15) # top 15 from reddit
sr.combine_titles() # combine the top titles
sr.display_titles() # display all the titles
main()
由于某些(对我而言)未知的原因,class 'sr' 中的数据似乎在调用
后丢失了sr.combine_titles()
当我尝试调用此方法时,class 中的数据为空:
sr.display_titles()
事实上,我确实看到 class 被销毁的消息:
SubRedditAnalyzer 已销毁
我做错了什么? 预先感谢您的关注。
似乎 self.submissions
可能是可迭代的但不是集合(例如列表)。 The docs call get_top_from_hour()
a generator method (although they state also that what is returned is a list...). If it is indeed a generator method,结果只能迭代一次。所有其他迭代尝试都将无声地失败(display_titles()
中的循环不执行任何操作)。
所以,解决方案是:
self.submissions = list(self.subreddit.get_top_from_hour(limit=10))
在 __init__()
中将可迭代对象转换为可迭代多次的永久集合(列表)。
根据 PRAW 文档,get_content
及其相关方法如 get_top_from_hour
return a generator。生成器只能迭代一次,您在 combine_titles
中进行了迭代。该次迭代后,生成器耗尽,无法再次迭代。
当您在 __init__
:
self.submissions = list(self.subreddit.get_top_from_hour(limit=10))