【问题标题】:Raise error in ternary statement in python, without using classic if/else syntax在 python 中的三元语句中引发错误,而不使用经典的 if/else 语法
【发布时间】:2019-02-22 10:03:13
【问题描述】:

是否可以在 python 中直接在三元语句中引发错误?

如:

import numpy as np
y = np.random.rand(200, 5, 5)

y = (y[:, None] if y.ndim == 1 
    else y if y.ndim == 2 
    else raise ValueError('`y` must be given as a 1D or 2D array.'))

当然,可以使用简单的 if/elif/else 语句来做到这一点。因此,我特意要求使用“单行”三元语句的解决方案。

只是为了澄清:
我知道三元语句不是为了引发错误,并且根据 PEP8 等,它不是好风格。我只是问是否有可能

【问题讨论】:

  • 我认为阅读这段代码的人会诅咒你,恕我直言。
  • @BearBrown 为什么?恕我直言,三元语句是简化代码的好工具。当然,引发错误可能不是他们打算做的事情,直到现在我才使用它们引发错误,但是这似乎是一种非常......“有趣”......的写作方式一个简短的表达。
  • 只需阅读PEP8 并尝试分析您的代码,例如使用pylint
  • @Scotty1- 你是对的。此语法从未打算用于引发错误。它适用于target = normal_value if expected_conditions() else fallback_value
  • @BearBrown 感谢您指出这一点。我一直使用 pylint 并尝试遵守 PEP8。正如我所说,我知道三元语句并不意味着引发错误。我不想开始讨论它是否是好的风格,因为我知道它不是。因此,我特别询问是否有可能

标签: python if-statement


【解决方案1】:

简单的技术答案:不,这是不可能的 - 正如您自己可能发现的那样,它会产生 SyntaxtError(raise 是一个语句,三元运算仅支持表达式)。

【讨论】:

  • 我认为你写的最好的解释:语句不能用于表达式,三元运算是表达式,raise 是一个语句,ergo:raise 不能用于三元运算。
  • 是的,一个简短但准确的解释。谢谢!
【解决方案2】:

你可以使用一个简单的辅助函数:

>>> def my_raise(ex): raise ex

>>> x = 1 if False else my_raise(ValueError('...'))
ValueError: ...

【讨论】:

  • 如果我有多个三元语句需要引发错误,这是一个很好的解决方案。但如果我只有一个,这就相当于在显式 if/else 语句中引发错误。
【解决方案3】:

你可能不应该这样做,但你可以调用一个总是导致异常的表达式:

y = "foo" if condition else int(None)

如果condition=True,这会将foo 分配给y,否则将引发TypeError

TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

【讨论】:

    猜你喜欢
    • 2018-12-22
    • 1970-01-01
    • 2018-08-30
    • 2021-10-23
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 2015-11-10
    相关资源
    最近更新 更多