&引用;否则";在Python中被认为是有害的?

&引用;否则";在Python中被认为是有害的?,python,if-statement,Python,If Statement,在(by)中,他回答了一个关于Python的try…else语句的问题: 实际上,即使在if语句中 否则:真的会被滥用吗 创建非常困难的bug的方法 查找[…] 对其他事情三思而后行 通常是一个问题。避免它,除非 在if语句中,甚至 考虑将其他文件记录下来 条件使其明确 这是一个广泛持有的观点吗?是其他的吗?? 当然,你可以用它编写令人困惑的代码,但任何其他语言构造都是如此。在我看来,即使是Python的for…else也似乎是一件非常方便的东西(对于try…else)S.Lott已经明显地看到

在(by)中,他回答了一个关于Python的
try…else
语句的问题:

实际上,即使在if语句中 否则:真的会被滥用吗 创建非常困难的bug的方法 查找[…]

对其他事情三思而后行 通常是一个问题。避免它,除非 在if语句中,甚至 考虑将其他文件记录下来 条件使其明确

这是一个广泛持有的观点吗?是
其他的吗?


当然,你可以用它编写令人困惑的代码,但任何其他语言构造都是如此。在我看来,即使是Python的
for…else
也似乎是一件非常方便的东西(对于
try…else
)S.Lott已经明显地看到了一些坏代码。不是所有的吗?我不认为其他有害的,虽然我见过它写坏代码。在那些情况下,所有周围的代码也坏了,为什么要责怪可怜的其他人?< /P> < P>不,它不是有害的,是必要的。 应该始终有一个catch all语句。所有开关都应该有一个默认值。ML语言中的所有模式匹配都应该有一个默认值

在一系列if语句之后不可能推理出什么是真的论点是生活中的事实。计算机是世界上最大的有限状态机,在每种情况下列举每一种可能性都是愚蠢的


如果你真的担心未知错误会在else语句中被忽略,那么在那里引发异常真的有那么难吗?

对我来说,某些流行语言结构本质上是不好的整个概念是完全错误的。即使是
goto
也有它的位置。我见过像Walte这样的人编写的非常可读、可维护的代码r Bright和Linus Torvalds使用它。只教程序员可读性很重要并使用常识比武断地声明某些结构“有害”要好得多.

说else是有害的,有点像说变量或类是有害的。见鬼,这甚至就像说goto是有害的。当然,事情可能会被误用。但在某些时候,你只需要相信程序员是成年人,并且足够聪明,不要这样做


这句话的意思是:如果你不愿意使用某个东西,因为Dijkstra或是一篇著名的文章,或者是一篇博客文章告诉你不要这么做的话,你就需要考虑一下编程是否适合你。

< P>我不会说这是有害的,但是有时候SLE语句会给你带来麻烦。nce,如果您需要基于一个输入值进行一些处理,并且只有两个有效的输入值。仅检查一个输入值可能会引入错误。 例如:


在这种情况下,使用else将允许处理除1以外的所有值,而该值应仅用于值1和2。

在假设难以推理的示例中,可以显式写入else,但仍然需要else。 例如

如果a<10:
#明确规定的条件
如果a>10且b<10:
#条件令人困惑,但至少是明确的
其他:
#这里到底是什么?
#很难推理出什么条件是真实的
可以写

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?
如果a<10:
#明确规定的条件
如果a>10且b<10:
#条件令人困惑,但至少是明确的
如果a>10且b>=10:
#其他条件
其他:
#处理有错误的边缘情况?

在记录关于代码的假设时,Else最有用。它确保您已经考虑了if语句的两面


在每个if语句中始终使用else子句甚至是“Code Complete”中的推荐做法。

包含else语句(oftry…else)的基本原理在Python中,首先是只捕获您真正想要的异常。通常,当您有一个
try…except
块时,有一些代码可能引发异常,然后还有一些代码只有在前一个代码成功时才应该运行。如果没有
else
块,您必须将所有代码放入n在
try
块中:

try:
    something_that_might_raise_error()
    do_this_only_if_that_was_ok()
except ValueError:
    # whatever
try:
    something_that_might_raise_error()
except ValueError:
    # whatever
else:
    do_this_only_if_that_was_ok()
问题是,如果
do\u this\u only\u如果
引发
ValueError
,它会被
except
语句捕获,而您可能不想被捕获。这就是
else
块的目的:

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

我想这在某种程度上是一个意见问题,但我个人认为这是一个很好的想法,尽管我很少使用它。当我使用它时,感觉非常合适(此外,我认为它有助于澄清代码流)相反……在我看来,每个if都必须有一个else。当然,你可以做愚蠢的事情,但如果你足够努力,你可以滥用任何构造。你知道有句谚语“一个真正的程序员可以用每种语言编写FORTRAN”


我经常做的是把else部分作为注释来写,描述为什么没有什么可以做。

在我看来,对于任何存在默认场景或副作用的语言和流控制语句,该场景需要有相同的考虑级别。if或switch或while中的逻辑只与条件if(x)while(x)或for(…)。因此该语句是无害的,但其条件中的逻辑是无效的

因此,作为开发人员,我们有责任在编写代码时考虑到其他的广泛范围。太多的开发人员将其视为“如果不是上述的话”,而实际上它可以忽略所有的常识,因为其中唯一的逻辑是对前面的逻辑的否定,这通常是不完整的。(算法设计错误本身)

我不认为“否则”比在For()循环或坏内存管理中更有害,这都是关于算法的。如果你的自动机是完整的。

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:
    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'
if foo:
    # ...
elif bar:
    # ...
# ...
if foo:
    # ...
else:
    # at this point, we know that bar is true.
    # ...
# ...
if foo:
    # ...
else:
    assert bar
    # ...
# ...
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");
if a==4:
    if b==2:
        print "here!"
else:
    print "which one"
if a==4:
    if b==2:
        print "here!"
    else:
        print "which one"