我正在尝试将raise if
压缩到一行。我有:
def hey(self, message):
if not message:
raise ValueError("message must be a string")
它有效,但此代码不起作用:
def hey(self, message):
raise ValueError("message must be a string") if not message
我得到SyntaxError: invalid syntax
。我该怎么办?
答案 0 :(得分:12)
.... if predicate
在Python中无效。 (你来自Ruby吗?)
使用以下内容:
if not message: raise ValueError("message must be a string")
<强>更新强>
要检查给定消息是否为字符串类型,请使用isinstance
:
>>> isinstance('aa', str) # OR isinstance(.., basestring) in Python 2.x
True
>>> isinstance(11, str)
False
>>> isinstance('', str)
True
not message
没有做你想做的事。
>>> not 'a string'
False
>>> not ''
True
>>> not [1]
False
>>> not []
True
if not message and message != '':
raise ValueError("message is invalid: {!r}".format(message))
答案 1 :(得分:4)
python支持
expression_a if xxx else expression_b
等于:
xxx ? expression_a : expression_b (of C)
但是
statement_a if xxx
是不可接受的。
答案 2 :(得分:0)
从您的代码看来,您似乎在询问如何检查输入是否为字符串类型。基于@falsetru的更新答案,我建议以下内容。请注意,我已将错误更改为TypeError
,因为它更适合这种情况
def hey(msg):
if not isinstance(msg, str): raise TypeError
PS!我知道这是旧帖子。我只是在发贴,以防其他人觉得它有用;)
答案 3 :(得分:0)
一个老问题,但这是另一个可以给出相当简洁的语法而没有assert
的缺点的选项(例如,当使用优化标志时它消失了):
def raiseif(cond, msg="", exc=AssertionError):
if cond:
raise exc(msg)
适用于此特定问题:
def hey(self, message):
raiseif(
not isinstance(message, str),
msg="message must be a string",
exc=ValueError
)