Python中的"或死()"

war*_*iuc 43 python

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

def die(error_message):
    raise Exception(error_message)

...

check_something() or die('Incorrect data')
Run Code Online (Sandbox Code Playgroud)

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

你觉得这个[风格]有什么(dis)优势吗?

cwa*_*ole 70

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

diePHP 中该方法的主要用途是,"脚本已经达到了一些无法从中恢复的僵局".很少(如果有的话)用于生产代码.您是关在一个调用的函数抛出一个异常,在父捕获它,并找到一个体面退出好点-这是在两种语言的最佳途径.

  • ......你可以在Perl中捕获死亡......这太棒了.(不是试图开始一场火焰战,我只是觉得那很搞笑) (8认同)
  • 好吧,`die`可以在Perl中捕获(虽然不是PHP). (4认同)
  • 不确定我想要死 - 我希望它没有传染性:-) (4认同)
  • 值得称之为'''die'''是在Perl 5中引发异常的标准方法.Perl中的'''或者死...'''表达式正在转变非致命性的回归将错误转化为可捕获的异常.通常,您不会在Python中编写此内容,因为Python默认在任何地方引发异常. (3认同)
  • 希望我能两次+1这个.在源代码中看到"死"的开发人员可能合理地期望死亡的尝试不能被捕获; 因此,如果应该实现die(),它应该调用os._exit(1). (2认同)

Dun*_*can 37

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

assert check_something(), "Incorrect data"
Run Code Online (Sandbox Code Playgroud)

请注意,如果您打开优化,它将不会进行检查,而不是任何人都做过.


Kei*_*ens 18

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

if not check_something():
    raise Exception('Incorrect data')
Run Code Online (Sandbox Code Playgroud)

FWIW,执行"或死(...)"方式会增加堆栈跟踪的另一个级别,这是另一个小缺点.


Ign*_*ams 6

最大的缺点是所有的死亡现在都是一样的.最好check_something()提出一个更准确的例外,然后在适当的时候赶上.