Python是否支持Elvis operator?关于简洁等价ternary operator的问询
好问题!Python本身并没有内置像Java、Kotlin这类语言里的Elvis运算符(就是那种x = f() ?: g()的超简洁写法),不过我们可以用几种Python风格的写法来实现完全等价的逻辑,下面给你详细说说:
利用短路求值的
or运算符(最接近Elvis的简洁写法)
如果你能接受“只要f()返回真值就用它,否则用g()”的逻辑,可以直接这么写:x = f() or g()原理是Python的
or会短路求值:如果左边的表达式是真值,直接返回左边的值;只有左边是假值(比如None、0、""、[]这类)时,才会执行并返回右边的g()。
👉 注意坑点:如果f()本身合法的返回值就是假值(比如你预期它可能返回0),那这个写法就会错误地触发g(),这时候就不能用这个方法。标准三元运算符(更严谨,避免重复执行)
Python的标准三元写法是x = a if condition else b,如果直接写成:x = f() if f() else g()会有个问题:
f()会被执行两次。如果f()是有副作用的函数(比如写文件、发请求),这肯定不是你想要的。所以更稳妥的写法是先把f()的结果存起来:f_result = f() x = f_result if f_result else g()针对
None判断的严谨写法
如果你只想在f()返回None的时候才用g(),而不是所有假值,可以专门判断None:x = f() if f() is not None else g()要是处理对象属性的场景(比如其他语言里
obj.attr ?: default的用法),Python里还可以用getattr来实现更安全的访问:x = getattr(obj, 'attr', default_value)这个写法会在
obj没有attr属性时直接返回default_value,比obj.attr or default_value更安全,不会因为attr本身是假值而误触发默认值。
总结一下:Python没有专门的Elvis运算符,但根据你的具体需求,选上面的某一种写法就能实现同样的功能啦~
内容的提问来源于stack exchange,提问作者Cory Klein

