在单行脚本中导入后使用三元运算符的语法无效



我正在将一些 python 作为单行脚本运行,但收到以下错误

>>> import ipaddress; (ipaddress.IPv4Address('1.1.1.1') in ipaddress.IPv4Network('1.1.1.1/32')) ? raise Exception('xxx') : pass;
  File "<stdin>", line 1
    import ipaddress; (ipaddress.IPv4Address('1.1.1.1') in ipaddress.IPv4Network('1.1.1.1/32')) ? raise Exception('xxx') : pass;
                                                                                                ^
SyntaxError: invalid syntax

我也试过:

>>> import ipaddress; raise Exception('xxx') if (ipaddress.IPv4Address('1.1.1.1') in ipaddress.IPv4Network('1.1.1.1/32'));
  File "<stdin>", line 1
    import ipaddress; raise Exception('xxx') if (ipaddress.IPv4Address('1.1.1.1') in ipaddress.IPv4Network('1.1.1.1/32'));
                                                                                                                         ^
SyntaxError: invalid syntax

为什么此语法无效?有没有其他方法可以实现相同的最终目标?

我从第三方工具(terraform(运行此代码,因此它必须是单行脚本。

Python 没有这样的三元运算符?

等效:

condition_if_true if condition else condition_if_false

不能使用三元运算符引发异常,因为它处理表达式,而raise是一个语句。这似乎可以工作,但也引发了语法错误。

import ipaddress; if ipaddress.IPv4Address('1.1.1.1') in ipaddress.IPv4Network('1.1.1.1/32'): raise Exception('xxx')

所以你能得到的最接近的可能是这个(@glhr已经建议了(:

import ipaddress
if ipaddress.IPv4Address('1.1.1.1') in ipaddress.IPv4Network('1.1.1.1/32'): raise Exception('xxx')

或者这个(这也显示了 Python 三元运算符的正确语法(:

def raise_error(err):
    raise err
import ipaddress; raise_error(Exception('xxx')) if ipaddress.IPv4Address('1.1.1.1') in ipaddress.IPv4Network('1.1.1.1/32') else None

你也可以在这里找到一些有用的想法(事实证明他们也想到了我的第二个想法(: 在条件表达式上提出语句

Python 中三元运算的正确语法是

a if condition else b

但请注意,这里的b是一个表达式,而不是任意的 Python 语句。不能在条件表达式中使用raisepass

如果要在条件为 false 时引发异常,则可以获得代码的最短值为:

import ipaddress
if not ipaddress.IPv4Address('1.1.1.1') in ipaddress.IPv4Network('1.1.1.1/32'): raise Exception('xxx')

我假设你正在努力实现这一目标。

import ipaddress
try:
    ipaddress.IPv4Address('1.1.1.1') in ipaddress.IPv4Network('1.1.1.1/32')
except:
    raise Exception('xxx')

这是一个衬里将用于抛出异常将是

if ipaddress.IPv4Address('1.1.1.1') in ipaddress.IPv4Network('1.1.1.1/32'): raise Exception('xxx')

这是一种非常糟糕的方法。但一切都在一条线上。每次需要使用时,您都会导入模块。

if not __import__("ipaddress").IPv4Address('1.1.1.1') in __import__("ipaddress").IPv4Network('1.1.1.1/32'): raise Exception('xxx')

最新更新