2015-10-06 83 views
0

我正在为Reddit创建一个Bot。我目前只有1个非常大的函数,我正在创建子函数以使其更具可读性。Python:将大功能分解为段

这里是做什么的

def replybot(): 
    submissions = reversed(list(subreddit.get_new(limit=MAXPOSTS))) 
    for post in submissions: 
     try: 
      author = post.author.name 
     except AttributeError: 
      print "AttributeError: Author is deleted" 
      continue # Author is deleted. We don't care about this post. 
     # DOES PID EXIST IN DB? IF NOT ADD IT 
     cur.execute('SELECT * FROM oldposts WHERE ID=?', [pid]) 
     sql.commit() 
     if cur.fetchone(): # Post is already in the database 
      continue 
     cur.execute('INSERT INTO oldposts VALUES(?)', [pid]) 
     sql.commit() 
... 

我期待了破解密码进入段大致击穿即把

 try: 
      author = post.author.name 
     except AttributeError: 
      print "AttributeError: Author is deleted" 
      continue # Author is deleted. We don't care about this post. 

在它自己的功能,从内部调用它replybot()但我遇到了致电continue的问题。我得到SyntaxError: 'continue' not properly in loop

有没有办法让我这样做?

回答

2

再次引发错误而不是尝试继续。无论是简单地让它冒泡到主循环,或者如果你需要更好的错误处理,请自己定制错误。例如:

class MyNotFatalError(Exception): 
    pass 

def do_something(): 
    try: 
     a, b, c = 1, 2 
    except ValueError: 
     raise MyNotFatalError('Something went wrong') 

# In your main function 
for post in submissions: 
    try: 
     do_something() 
     do_some_other_thing() 
     do_some_more() 
    except MyNotFatalError as err: 
     continue # we could print out the error text here 
    do_some_last_thing() 

这可能是更好的,那是因为你只抓住你知道你想捕获错误,还让当有实际错误的程序崩溃。

如果您只是简单地抓到了ValueError,它也会拦截并隐藏所有其他类型错误的可能来源。

+0

如果我的代码在其中“继续”,我该怎么办? – Bijan

+0

在主循环中,你可以在任何你想要的地方使用'continue'。在子函数中,改用'raise MyNotFatalError()'。如果您可能会继续执行并非实际错误的条件,那么可以将该异常重命名为更有意义的内容,如“SkipCurrentPost” – spectras

3

如果你把一个循环的内部部分转换成它自己的函数,它不再是一个循环。对于函数,循环中的continue等效于return(即提前终止此迭代(现在是函数调用))。

+0

不会'return'继续运行的(大),其余功能虽然?我想跳到下一个迭代 – Bijan

+0

@Bijan:嗯,那么你会想要返回一个有意义的值,并检查它,并继续。例如说你拿出的代码片段叫做'get_author()',你可以用'return post.author.name'替换'author = post.author.name',而不是'continue',你会'返回None' 。然后在调用代码中,您执行'author = get_author()'和'if not author:continue'。 – Claudiu

1

正如Claudiu所说,当你将内部命令分解成它自己的功能时;这不是不再循环,你的代码将是这个样子:

def isNotAuthorDeleted(post): 
    try: 
     author = post.author.name 
     return author 
    except AttributeError: 
     print "AttributeError: Author is deleted" 
     return false 

和你的循环将是:

for post in submissions: 
    if not isNotAuthorDeleted(post): 
     continue