在一个 答案 (通过 S.洛特) 一个问题,蟒蛇的 try...else 声明:

实际上,甚至在一个如果声明, 别的:可能被滥用的真正可怕的 方式创建的错误,这都很难 找到。[...]

两次考虑其他的:.它是 通常一个问题。避免它除了 在一个如果声明以及即使在那 考虑记录的人 条件,使它明确。

这是一个广泛持有的意见吗?是 else 被认为是有害的?

当然你也可以写入混乱的代码与它,但这是真实的任何其他语言结构。甚至蟒蛇的 for...else 在我看来,一个非常方便的事情有(下使用 try...else).

有帮助吗?

解决方案

美国洛特显然已经看到了一些不好的代码在那里。我们不是呢?我不认为其他有害的,虽然我已经看到了它用来编写糟糕的代码。在这种情况下,所有周围的代码一直不好,以及,为什么怪别人差?

其他提示

没有它不是有害的,这是必要的。

有应该永远是一个包罗万象的声明。所有开关应该有一个默认值。所有在ML语言匹配模式应该有一个缺省值。

在争论,这是不可能的道理经过一系列的if语句是不争的事实是真的。该计算机是最大的有限状态机在那里,它是愚蠢的枚举在每种情况下每一个可能性。

如果你是真的害怕未知的错误去else语句被忽视,是不是真的那么难引发异常呢?

话说,否则被认为是有害的是一个有点像说,变量或类是有害的。哎呀,它甚至喜欢说的goto是有害的。当然,事情也可能被滥用。但在某些时候,你就必须相信程序员是成人和足够聪明,不。

什么它归结为是这样的:如果你愿意不使用的东西,因为在SO答案或通过Dijkstra算法博客文章,甚至是著名的论文叫你不要,你需要考虑,如果规划是正确的职业适合你。

我不会说这是有害的,但有些时候,else语句可以让你陷入困境。举例来说,如果你需要做基于输入值进行一些处理,并只有两个有效的输入值。只检查一个可能引入的错误。 例如:

The only valid inputs are 1 and 2:

if(input == 1)
{
   //do processing
   ...
}
else
{
   //do processing 
   ...
}

在此情况下,使用人会允许除1以外的所有值时,只应为值1和2以进行处理。

在我看来,某些流行的语言结构的固有地坏的整个概念是完全错误的。即使goto有它的地方。我已经沃尔特·布莱特和Linus Torvalds在使用它的人喜欢看到非常可读的,可维护的代码。这是更好的,只是教的程序员可读性数和使用常识,而不是武断地宣称某种构造“有害”。

如果你写的:

if foo:
    # ...
elif bar:
    # ...
# ...

,则读取器可以被在想:如果什么都不foo也不bar是真的?也许你知道,从你的代码的理解,它必须是要么foobar的情况。我宁愿看到:

if foo:
    # ...
else:
    # at this point, we know that bar is true.
    # ...
# ...

或:

if foo:
    # ...
else:
    assert bar
    # ...
# ...

这清楚你如何指望控制流动,而不需要读者有哪里foo成竹在胸和bar来自读者。

(在原来的情况下,你仍然可以写注释解释发生了什么,但我想我会再怀疑:“为什么不直接使用一个else:条款”)

我认为这一点是不是说你不应该使用else:;更确切地说,是else:子句可以让你写代码不清,你应该尝试去辨认时发生这种情况,并加少许评论助阵任何读者。

这大约是在编程语言中最真实的东西,真正做到: - )

金恰恰相反......在我看来,必须有一个else每一个如果。当然,你可以做愚蠢的事情,但如果你足够努力,你可以滥用任何结构。你知道说:“一个真正的程序员可以把每一种语言编写FORTRAN”。

我做很多的时间是什么else部分写的评论,说明为什么有什么工作要做。

<强>否则记录有关代码的假设时是最有用的。它确保您通过if语句两侧认为。

始终使用else子句每个if语句是即使在“代码大全”值得推荐的做法。

背后包括else声明(try...else的)在Python摆在首位的理由是只有抓住你真的想例外。通常,当你有一个try...except块,还有一些代码,可能会引发异常,然后有更多的代码,如果前面的代码是成功的应该只运行。如果没有else块,你必须把所有的代码在try块:

try:
    something_that_might_raise_error()
    do_this_only_if_that_was_ok()
except ValueError:
    # whatever

问题是,如果有什么do_this_only_if_that_was_ok()提出了一个ValueError?它将使except声明被抓住,当你可能没有想它。这就是else块的用途:

try:
    something_that_might_raise_error()
except ValueError:
    # whatever
else:
    do_this_only_if_that_was_ok()

我想这是舆论在一定程度上的问题,但我个人认为这是一个伟大的想法,即使我用它很少。当我使用它,就觉得这是非常合适的(而且,我认为它有助于澄清码流位)

在我看来,对于任何语言,其中有一个默认的情况下或副作用的任何流量控制语句,该场景需要有考虑的同一水平。如果在或交换机或而逻辑仅是作为条件一样好,如果(x)的,而(x)或为(...)。因此该语句不是有害的,但在他们的状况,所述逻辑。

因此,作为开发商,我们有责任将代码与在-心目中的其他范围广。太多的开发者把它当作一个“如果不是上述”时,其实它也可以忽略所有的常识,因为它的唯一逻辑是前面的逻辑,这通常是不完全的否定。 (算法设计错误本身)

我不那么认为“别人”比任何危害更大的off-by-那些在for()循环或坏的内存管理。它的所有有关的算法。如果你的自动机在其范围和可能的分支完整,都是具体和理解则没有危险。危险的是人们没有意识到宽领域逻辑的影响表现背后的逻辑的滥用。 电脑是愚蠢的,他们做什么,他们是由他们的经营者告诉(理论上)

我不认为在尝试是危险的,因为它可以否定处理,以代码的一个未知数。分支以上的提高可以包含一个错误,由在强调提高本身。这是可以是非显而易见的。它像转动一个顺序指令集成树状或错误处理图,其中每个分量是依赖于在父分支。奇。你要知道,我喜欢C。

有是设置在C家族语言遇到所谓的“悬空其他”的问题如下:

if (a==4)
if (b==2)
printf("here!");
else
printf("which one");

此无辜代码可以以两种方式来理解:

if (a==4)
    if (b==2)
        printf("here!");
    else
        printf("which one");

if (a==4)
    if (b==2)
        printf("here!");
else
    printf("which one");

的问题是,所述“其他”是“悬空”,一个可以迷惑的其他所有者。当然编译器不会使这种混乱,但它是有效的凡人。

感谢Python中,我们不能在Python中晃来晃去别的问题,因为我们在写任何

if a==4:
    if b==2:
        print "here!"
else:
    print "which one"

if a==4:
    if b==2:
        print "here!"
    else:
        print "which one"

这样人眼捕获它。而且,不,我不认为“别人”是有害的,它是“如果”。

有害

在假定的是难以原因的例子中,它可以被明确地写入,但其他仍然是必要的。 例如。

if a < 10:       
    # condition stated explicitly   
elif a > 10 and b < 10:       
    # condition confusing but at least explicit   
else:       
    # Exactly what is true here?       
    # Can be hard to reason out what condition is true

可被写入

if a < 10:       
    # condition stated explicitly   
elif a > 10 and b < 10:       
    # condition confusing but at least explicit   
elif a > 10 and b >=10:
    # else condition
else:   
    # Handle edge case with error?

我觉得相对于try...except...else的一点是,它是一个容易犯的错误使用它的创建的不一致的状态,而不是修复它。这并不是说,应该不惜一切代价避免的,但它可以是适得其反。

考虑:

try:
    file = open('somefile','r')
except IOError:
    logger.error("File not found!")
else:
    # Some file operations
    file.close()
# Some code that no longer explicitly references 'file'

这将是真正的好要说的是,上述块从试图访问不存在的文件,或者该用户没有权限的目录防止代码,并说一切都被封装,因为它是内一个try...except...else块。但在现实中,在上述形式大量的代码真的应该是这样的:

try:
    file = open('somefile','r')
except IOError:
    logger.error("File not found!")
    return False
# Some file operations
file.close()
# Some code that no longer explicitly references 'file'

您经常说,由于file在范围上不再被引用,它的好去块编码之后愚弄自己,但在许多情况下,事情会拿出它仅仅是不行的。或者一个变量将在后面的是未在else块创建的except块内创建。

这是我会怎样区分if...elsetry...except...else。在这两种情况下,必须使并行在大多数情况下(变量和状态在一个应在其他应设置设置),但在后者的块,程序员通常不这样做,可能是因为它是不可能的或不相关的。在这种情况下,往往会令很多更多意义返回给调用者,而不是试图保持周围你认为你将在最好的情况下工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top