2017-09-15 76 views
3

它是否会阻止问题在重新定义条件的所有可能分支之前定义变量?在条件中声明变量是否存在问题?

例如应此代码:

# Condition could fail 
    try: 
     textureIndices = someExpression() 

    # textureIndices is defined here if it does 
    except: 
     textureIndices = [] 

    return textureIndices 

重新写成这样:

# textureIndices is defined early and then re-defined in the conditional 
    textureIndices = None 

    try: 
     textureIndices = someExpression() 


    except: 
     textureIndices = 66 

    return textureIndices 

,或者因except打开等问题,是否存在与textureIndices这里定义一个问题:

if condition: 
    textureIndices = someExpression() 

else: 
    textureIndices = 66 

return textureIndices 

减少问题?

唯一的区别是在第二个版本textureIndices是在条件之外定义的。

我不明白为什么它很重要,因为textureIndices不可能在条件中被赋予一个值,但我可以看到为什么从管家的角度来看,很高兴知道该变量被分配给某些东西。

例如如果有第一个例子没有except语句,那么textureIndices并不总是被定义和return会导致错误。

但是,如果不转发在两个条件的原因中定义的定义变量,是否存在问题?

+1

在你的第一个案例中,除了SomeError外,你使用'except'而不是''。既然你不应该把所有的错误都包括在内,那么在你的实践中,你的变量是不可能存在的,除非你先前定义了它。 – roganjosh

+0

“应重写”的来源是什么?编译器和运行时系统很好。 – Prune

回答

4

其中一个原因是它会创建冗余代码。在这种情况下,它看起来不是很明显,但举一个例子,您有多个唯一的除外语句捕捉代码中的多个异常。想象一下,如果有人想重构你的代码或添加额外的除外声明。

textureIndices = None 

try : 
    textureIndices = [thing for thing in func()]fail 

except InvalidTextException: 
    textureIndices = [] 
    #lines to handle specific exception 
except ValueError: 
    textureIndices = [] 
    #lines to handle specific exception 
except OSError: 
    textureIndices = [] 
    #lines to handle specific exception 

return textureIndices 

如果你有多个这样表现的变量,你可以看到它如何快速升级。通过首先声明基本案例,可以减少冗余。

textureIndices = [] 

try : 
    textureIndices = [thing for thing in func()]fail 

except InvalidTextException: 
    #lines to handle specific exception 
except ValueError: 
    #lines to handle specific exception 
except OSError: 
    #lines to handle specific exception 

return textureIndices 
3

可变字典(取决于范围localsglobals),当创建一个变量被修改。

在一种情况下,您正在创建变量,然后修改它的任何分支:1创建+赋值,1赋值(完全覆盖旧值)。

在你忽略了事先建立的情况下,你只有1个创建+分配,所以在技术上它的速度更快事先声明其分支(少了一个字典查找,少了一个无用的分配)

除了帮助Python IDE完成分支中的变量名之外,我会说事先声明在这种情况下是无用的,甚至很麻烦,因为两个分支都被覆盖了(可能是一种旧的编译语言编程反射)。唯一可能有兴趣的情况是一组复杂的分支,您只需在几个分支中设置变量。这里不是这种情况。

+0

这里不是这种情况,但通常不应该在您遇到的错误中具体说明吗?即使你只捕获了2个特定的错误,其余的都会崩溃你的脚本,你必须定义默认值两次,并不会打败DRY(以非常小的方式)? – roganjosh

+1

不确定你在说什么。当然,尝试/除非没有异常类型(甚至是'Exception')是不好的做法。它甚至可以捕捉到CTRL + C。但是这似乎与这个问题无关。 –

+0

刚刚发布的答案说明了我的观点。我建议评论OP是基于这个问题关闭不适用于一个毯子'除' – roganjosh