由于Python的范围规则,之后在范围内初始化的所有变量都可用。由于条件不引入新范围,因此不一定需要其他语言的构造(例如在该条件之前初始化变量)。例如,我们可能有:
def foo(optionalvar = None):
# some processing, resulting in...
message = get_message()
if optionalvar is not None:
# some other processing, resulting in...
message = get_other_message()
# ... rest of function that uses message
或者,我们可以改为:
def foo(optionalvar = None):
if optionalvar is None:
# processing, resulting in...
message = get_message()
else:
# other processing, resulting in...
message = get_other_message()
# ... rest of function that uses message
当然,get_message
和get_other_message
函数可能是多行代码并且基本上不相关(您可以假设每个路径之后的程序状态是相同的);这里的目标是让message
准备好在函数的这一部分之外使用。
我已经看到后一种构造在其他问题中多次使用过,例如:
哪种结构更容易接受?
答案 0 :(得分:13)
Python也有一个非常有用的if语法模式,你可以在这里使用
message = get_other_message() if optional_var else get_message()
或者,如果您想严格比较无
message = get_other_message() if optional_var is not None else get_message()
与示例1)不同,您发布的不会不必要地调用get_message()。
答案 1 :(得分:4)
通常,第二种方法更好,更通用,因为它不涉及无条件地调用get_message
。如果该功能不是资源激励但考虑搜索功能
def search(engine):
results = get_from_google()
if engine == 'bing':
results = get_from_bing()
显然这不好,我不能想到第二种情况的这种不良情况,所以基本上是一种通过所有选项的方法,最后默认是最好的。例如。
def search(engine):
if engine == 'bing':
results = get_from_bing()
else:
results = get_from_google()
答案 2 :(得分:1)
我认为没有对此设置明确的规则更为诡计,而只是坚持认为小功能更好(部分原因是因为在引入新名称时可能会留在脑海中)。
我想虽然如果你的条件测试变得比if/else
复杂得多,你可能会冒所有失败的风险而后来使用未定义的名称,导致可能的运行时错误,除非你是非常小心。在可能的情况下,这可能是第一种风格的论据。
答案 3 :(得分:0)
答案取决于是否存在get_message()
所需的副作用。
在大多数情况下,显然第二个获胜,因为不会执行产生不需要的结果的代码。但如果你需要副作用,你应该选择第一个版本。
答案 4 :(得分:0)
在条件之外初始化变量可能更好(阅读:更安全)。如果您必须定义其他条件甚至删除某些条件,稍后message
的用户可能会获得未初始化的变量异常。