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 直接,不。 lambda
s 的主体仅accept expressions too。 int
或辅助函数等间接方法是这里唯一(丑陋的)选项。以上是关于if else 引发 ValueError的主要内容,如果未能解决你的问题,请参考以下文章
Python:在 try/except/else 块中引发异常,处理顺序问题