以单引号传递Python列表



我有一段类似下面的代码,用于向API调用发送IP地址列表。

body = {'cID': id, 'dbType': params['db-type'].upper(), 'cidrList': eval(params['--cidr-list'])}
print(json.dumps(body))
conn.request("POST", "/Link/to/API", body=json.dumps(body), headers=header)
check_resp(200)
logger.info("Rules changed successfully")

然而,当我使用下面的params调用此代码时,它失败了。

--cidr-list ['10.20.0.0/32','10.30.0.0/32']

当我使用以下内容时,它会起作用。

--cidr-list ["10.20.0.0/32","10.30.0.0/32"]

因此,基本上,当我使用"包装列表中的每一项时,它都被解析为单引号。如何更改代码以使其接受输入1?我是Python的新手,如果你也能解释一下它背后的逻辑,我将不胜感激。提前谢谢。

不要把了解Python作为使用程序的必要条件。

body = {
'cID': id,
'dbType': params['db-type'].upper(),
'cidrList': params['--cidr-list'].split(',')
}
print(json.dumps(body))
conn.request("POST", "/Link/to/API", json=body, headers=header)
check_resp(200)
logger.info("Rules changed successfully")

然后用调用脚本

script.py ... --cidr-list 10.20.0.0/32,10.30.0.0/32

所有参数都已经是字符串;您不需要对用户强制使用Python字符串文字语法,并且逗号分隔的字符串足以处理成CIDR地址列表,而无需对用户强制执行Python列表语法。

您需要转义单引号,因为它们也被shell使用。

--cidr-list ['10.20.0.0/32','10.30.0.0/32']

最好的方法是把整个论点引起来。

--cidr-list "['10.20.0.0/32','10.30.0.0/32']"
or
--cidr-list '["10.20.0.0/32","10.30.0.0/32"]'

顺便说一句,你应该使用ast.literal_eval()而不是eval()