我在Pinax和其他django应用程序中看到了一些代码,而不是传递,使用了一个空的return语句。有什么区别,它会对我正在运行的下面的django代码有什么影响吗?代码是一种信号方法,可以自动将主题标签保存到tweet对象的taggit Tag对象中。
我在这里看到一个问题,关于在PHP中是否使用return语句会对解释的字节码产生影响,但我不确定它是否与Python相关。
import re
TAG_REGEX = re.compile(r'#(?P<tag>\w+)')
def get_tagged(sender, instance, **kwargs):
"""
Automatically add tags to a tweet object.
"""
if not instance:
return # will pass be better or worse here?
post = instance
tags_list = [smart_unicode(t).lower() for t in list(set(TAG_REGEX.findall(post.content)))]
if tags_list:
post.tags.add(*tags_list)
post.save()
else:
return # will a pass be better or worse here?
post_save.connect(get_tagged, sender=Tweet)
答案 0 :(得分:61)
if not instance:
return # will pass be better or worse here?
更糟。它改变了逻辑。 pass
实际上意味着:什么也不做。如果你在这里用return
替换pass
,控制流将继续,改变代码的语义。
pass
的目的是创建空块,否则使用Python的缩进方案是不可能的。例如,C中的空函数如下所示:
void foo()
{
}
在Python中,这将是语法错误:
def foo():
这是pass
方便的地方:
def foo():
pass
答案 1 :(得分:18)
答案 2 :(得分:17)
这说明了一些早期的答案。
def p():
"Executes both blocks."
if 1:
print(1)
pass
if 1:
print(2)
pass
def r():
"Executes only the first block."
if 1:
print(1)
return
if 1:
print(2)
return
答案 3 :(得分:1)
if not instance:
return # will pass be better or worse here?
pass
将继续执行该方法。 return
将终止方法的执行。关于以下几行,您希望将return
放在此处。
else:
return # will a pass be better or worse here?
这里没有什么区别。即使删除整行也不会改变任何内容。
但无论如何,想象一下你会进一步详细说明这个方法。最好从一开始就选择合适的流程。
答案 4 :(得分:1)
这更多是评论而不是答案,但它不适合作为评论。
if not instance:
return # will pass be better or worse here?
如接受的答案所述,pass
不正确。
else:
return # will a pass be better or worse here?
在这里,由于我们处于函数的末尾,pass
会做同样的事情:没有。更好的是完全放弃else
条款,因为没有任何事情可做。 (禅宗中的“明确胜于隐性”确实如此,但这很少适用于明确无所作为 - 很明显else
案件中发生的事情,对于那些实际上甚至对此一无所知的人来说都是如此。 )
(还不清楚为什么要在函数中将instance
重命名为post
- 您可以只更改参数名称? - 或者sender
参数应该是什么。哦,你实际上并不需要将set
转换为list
以在列表解析中迭代它。:))
答案 5 :(得分:0)
查看pass和return上的python文档。在你当前的代码中没有什么区别(事实上,我会完全离开else
。)
区别主要在于语义:pass
可用于语法需要语句但不需要语句的地方。另一方面,return
履行一种函数契约,提供明确的结果。
答案 6 :(得分:0)
if not instance:
return # will pass be better or worse here?
情况会更糟,因为在这种情况下,即使没有 instance
,它也会在您定义的函数中执行以下代码行。
pass
有它自己的本质,它用于定义空块,不应将其视为 return
语句的替代。