if else 引发 ValueError

Posted

技术标签:

【中文标题】if else 引发 ValueError【英文标题】:if else to raise a ValueError 【发布时间】:2018-05-21 16:32:12 【问题描述】:

我正在关注这个:

if else in a list comprehension

但是下面的小程序产生了语法错误:

def to_rna(dnasequences):
    xlate = 'G': 'C', 'C': 'G', 'T': 'A', 'A': 'U'
    return ''.join(xlate[sequence] for sequence in dnasequences if sequence in xlate.keys() else raise ValueError)

else 子句产生了错误。

但是,如果我删除它运行的 else 子句,我想为任何输入引发一个 ValueError 这不是我的字典“xlate”中的键。

注意我正在研究来自 exercism.io 的 rna 转录问题。

我通过了 5 个单元测试,但我没有通过三个单元测试,因为无效输入需要 ValueError。

【问题讨论】:

如果你不能让单线工作,这是一个很好的迹象,表明你试图做太多。只需编写一个普通循环即可。 如果你坚持内联,并且因为你不关心消息,而不是raise ValueError 声明只需放置int(""),它会为你提出一个ValueError。或者,您知道,放弃列表理解并解开循环以正确执行。 【参考方案1】:

你不能在理解中做到这一点。条件表达式的形式为:

expr if expr else expr

(并且,子注意,它应该用在理解的开头)

虽然raise ExceptionClass is a statement,不是表达式。因此,提出了SyntaxError

简而言之,如果您确实想使用raise,则必须使用for 循环。


或者,如果您只是对推导非常感兴趣,您可以定义一个函数,然后您可以在 else 子句中调用它:

def raiser(exc_type):
    raise exc_type

这是因为函数调用是表达式。当然,这很丑。

【讨论】:

"虽然 raise ExceptionClass 是一个语句,而不是一个表达式。"这就是我错过的。 有趣。真的没有办法在表达式中执行raise 语句吗?即使是lambda 也无济于事。在扩展中,@zwer 的想法与int("Hi I am an error") 之类的消息似乎是我能想到的最接近的事情。当然,或者额外的方法。但是,是的,这很丑陋。 @Jeronimo 直接,不。 lambdas 的主体仅accept expressions too。 int 或辅助函数等间接方法是这里唯一(丑陋的)选项。

以上是关于if else 引发 ValueError的主要内容,如果未能解决你的问题,请参考以下文章

容易已发bug环节总结

容易已发bug环节总结

如果 else 标记引发错误,则内部循环标记的字符串

Python:在 try/except/else 块中引发异常,处理顺序问题

groupbox 中有多个radiobutton钮,当任一选择变化时,引发啥事件?

异常中的else