Python中的“或死()”

时间:2011-07-17 06:05:18

标签: python

有人在Python中使用这样的东西:

def die(error_message):
    raise Exception(error_message)

...

check_something() or die('Incorrect data')

我认为这种风格在PHP和Perl中使用。

你在这个[风格]中找到任何(dis)优势吗?

6 个答案:

答案 0 :(得分:69)

嗯,首先,sys.exit([arg])更常见,如果你真的想要在PHP中等同于die的东西,你应该使用它,引发SystemExit错误,或者调用{{ 3}}

PHP中die方法的主要用途是,“脚本已达到一些僵局无法从中恢复”。很少(如果有的话)用于生产代码。你最好在被调用函数中引发异常,在父代中捕获它,并找到一个优雅的退出点 - 这是两种语言中最好的方法。

答案 1 :(得分:36)

很多很好的答案,但是没有人建议用Python写出这个明显的方法:

assert check_something(), "Incorrect data"

请注意,如果您启用优化,它将不会进行检查,而不是任何人都会这样做。

答案 2 :(得分:18)

虽然这种风格在PHP和Perl中很常见,但它非常不具有Pythonic,我建议你不要用这种方式编写Python。您应该遵循您正在使用的语言的约定,并写下这样的内容:

if not check_something():
    raise Exception('Incorrect data')

FWIW,执行“或死(...)”方式会为堆栈跟踪添加另一个级别,这是另一个小缺点。

答案 3 :(得分:6)

最大的缺点是所有的死亡现在都是一样的。最好让check_something()提出一个更准确的例外,然后在适当的情况下将其赶上来。

答案 4 :(得分:4)

如果你正在处理一个你没有编写的API,它会在成功时返回真值,而在失败时返回虚假值,这似乎是一种相当可读和紧凑的方法。如果您可以控制API,我建议您使用异常而不是返回值来指示错误。

如果您使用该函数,它可能不应被称为die(),除非它实际退出程序。如果它只是引发异常,则无法保证程序实际会死亡。理想情况下,您可以将其命名为raise()作为raise语句的功能版本,但当然不能,因为raise是保留字。也许是throw()

要求调用者传入异常类型也是一个好主意,因为Exception非常通用且含糊不清。

在我看来,如果只有Python异常能够提升自己,那么这个函数是不必要的,也就是说,他们有一个方法,如下所示:

class BaseException(object):
     def throw(self):
         raise self

然后你可以这样做:

check_something() or Exception("check failed").throw()

可悲的是,Python异常无法提升自己。 : - )

答案 5 :(得分:3)

看起来你只是在python中使用一行函数包装php lingo。我会反对它,因为你可能会混淆你的观众。在PHP中,异常也是一种完全不同的野兽。