【问题标题】:raise statement on a conditional expressionraise 条件表达式上的语句
【发布时间】:2012-04-24 10:09:13
【问题描述】:

遵循“武士原则”,我正在尝试在我的功能上执行此操作,但似乎是错误的......

return <value> if <bool> else raise <exception>

还有其他“漂亮”的方法可以做到这一点吗?谢谢

【问题讨论】:

  • 这里的武士是什么?你觉得添加一些细节怎么样?
  • 武士原则 - 返回胜利,或者根本不返回。如果一个函数履行了它的职责,则返回相应的结果对象,如果没有,则抛出一个异常。
  • 哦,我明白了。也许一些链接会很好,例如Samurai Principle

标签: python exception conditional raise zen-of-python


【解决方案1】:

如果你绝对想在表达式中使用raise,你可以这样做

def raiser(ex): raise ex

return <value> if <bool> else raiser(<exception>)

如果函数中没有无条件的raise,则此“尝试”返回raiser() 的返回值,即None

【讨论】:

  • 在配置依赖于环境变量的设置文件时,我发现这对于简写三元组很方便。这样,我仍然可以在文件中保留干净的 dict 行,但在缺少特定设置时也会提供有用且更具体的错误消息。例如:{'f': os.environ.get('FOO') or raise_foobar(), ...}
【解决方案2】:

内联/三元 if 是一个表达式,而不是一个语句。您的尝试意味着“如果 bool,则返回值,否则返回 raise expression 的结果”——这当然是无稽之谈,因为 raise exception 本身就是一个语句而不是表达式。

没有办法以内联方式执行此操作,您也不应该这样做。明确地这样做:

if not bool:
    raise MyException
return value

【讨论】:

  • 我认为这个问题实际上可以翻译为:有没有办法将异常作为表达式而不是作为语句来引发?正如@glglgl 所建议的那样,答案是肯定的。
【解决方案3】:

我喜欢用断言来做,所以你强调该成员必须像合同一样。

>>> def foo(self):
...     assert self.value, "Not Found"
...     return self.value

【讨论】:

  • 这样你就不会提出特定的执行,对吧?
  • 我还注意到,与其他语言一样,assert 仅在 debug 时重现,所以如果您在运行时发现错误,它也会断言它吗?
  • 这不是很pythonic,如果你在没有首发选项的情况下运行Python解释器,前面提到过,断言将被忽略... P.D: -O :稍微优化生成的字节码;还有 PYTHONOPTIMIZE=x
  • self.value = 0 时会发生什么。如果我运行 >>> assert 0,它会引发错误。我想你将不得不改变你的例子。 编辑的问题
【解决方案4】:

好吧,你可以单独测试布尔值:

if expr: raise exception('foo')
return val

这样,您可以更早地测试expr

【讨论】:

    【解决方案5】:

    有一种方法可以在三元内加注,诀窍是使用exec

    def raising_ternary(x):
        return x if x else exec("raise Exception('its just not true')")
    

    如您所见,使用True 调用它会执行三元组的第一部分,使用False 调用它会引发异常:

    >>> def raising_ternary(x):
    ...     return x if x else exec("raise Exception('its just not true')")
    ... 
    >>> raising_ternary(True)
    True
    >>> raising_ternary(False)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 2, in raising_ternary
      File "<string>", line 1, in <module>
    Exception: its just not true
    >>> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多