Python 一行上升,如果

Python 一行上升,如果,python,Python,我试图将提升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 我得到语法错误:无效语法。我该怎么办?。。。。if谓词在P

我试图将
提升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

我得到
语法错误:无效语法
。我该怎么办?

。。。。if谓词
在Python中无效。(你是鲁比人吗?)

使用以下内容:

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

python支持

expression_a if xxx else expression_b
这等于:

xxx ? expression_a : expression_b (of C)
但是


不可接受。

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

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

PS!我知道这是一个老帖子。我只是想在别人觉得有用的时候发布;)

这是一个老问题,但这里有另一个选项,它可以提供相当简洁的语法,而不存在
assert
的一些缺点(例如,当使用优化标志时,它会消失):

适用于这一具体问题:

def hey(self, message):
    raiseif(
        not isinstance(message, str),
        msg="message must be a string",
        exc=ValueError
    )

还需要一个
else
子句,因此语法错误。@hcwhsa这是我遗漏的一点。谢谢将其“浓缩”到一个衬里不是蟒蛇式的,只是保持原样。作为旁注,空字符串的计算结果为False,因此您的测试被破坏或消息错误。@Brunodesshuilliers不知道这种类型转换,这会产生不同。@leemour:如果消息是字符串,则
不是消息和消息!=''是冗余的,因为空字符串的值为false。FWIW所有python对象都有一个真值,除非类另有说明,否则默认为True,cf
statement\u*
应该是
expression\u*
.x?y:z不是的有效语法python@alko请注意括号内的“Of C”。另一个选项是他受列表理解的影响。我不想显式验证它是否是字符串,因为它是反对的。可能错误消息不正确,但我想不出更好的消息了。@leemour,
“消息为空。”
?@falsetru此验证也会检查
False
,但我认为您的消息更好:)@leemour,如果
True
被传递,应该怎么办?这比OP想要压缩的代码要长,并且增加了调用额外函数的额外成本。函数调用的额外成本是公平的。关于代码长度,如果您删除关键字arg name并按照顶部答案中的建议合并
isinstance
逻辑,则实际上是相同的长度。如果不是isinstance(消息,str),则为
:RAISValueError(“消息必须是字符串”)
vs
raiseif(不是isinstance(消息,str),“消息必须是字符串”,VALUERROR)
。一般来说,
raiseif
函数将比标准的if/raise方法更加紧凑,如果您正在寻找类似于
assert
的东西,而这些东西不会被-O删除。这就是我在这里的原因。
def hey(msg):
    if not isinstance(msg, str): raise TypeError
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
    )