一线加注如果

时间:2013-11-07 07:16:50

标签: python

我正在尝试将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。我该怎么办?

4 个答案:

答案 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
    )