11

我正在尝试浓缩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

4 回答 4

15

.... 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))
于 2013-11-07T07:17:41.760 回答
4

蟒蛇支持

expression_a if xxx else expression_b

这等于:

xxx ? expression_a : expression_b (of C)

statement_a if xxx

是不能接受的。

于 2013-11-07T07:32:11.190 回答
1

老问题,但这是另一个选项,它可以提供相当简洁的语法而没有一些缺点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
    )
于 2020-03-23T01:02:22.903 回答
0

从您的代码中,您似乎在询问如何检查输入是否为字符串类型。根据@falsetru 的更新答案,我建议以下内容。请注意,我已将错误更改为,TypeError因为它更适合这种情况

def hey(msg):
    if not isinstance(msg, str): raise TypeError

PS!我知道这是一个旧帖子。我只是发布以防其他人发现它有用;)

于 2019-11-27T12:41:16.677 回答