什么是条件变量初始化的pythonic方式?

时间:2011-12-06 18:26:01

标签: python

由于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_messageget_other_message函数可能是多行代码并且基本上不相关(您可以假设每个路径之后的程序状态是相同的);这里的目标是让message准备好在函数的这一部分之外使用。

我已经看到后一种构造在其他问题中多次使用过,例如:

哪种结构更容易接受?

5 个答案:

答案 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的用户可能会获得未初始化的变量异常。