我正在将一些 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 语句。不能在条件表达式中使用raise
或pass
。
如果要在条件为 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')