Передав Python список в одинарной кавычке - PullRequest
0 голосов
/ 17 марта 2020

У меня есть фрагмент кода, подобный приведенному ниже, который используется для отправки списка IP-адресов на вызов API.

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")

Однако, когда я вызываю этот код с использованием приведенных ниже параметров, он не работает.

--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, и я был бы признателен, если бы вы также объяснили логику c. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Не делайте знание 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 синтаксиса списка для пользователя.

0 голосов
/ 17 марта 2020

Вы должны избегать одинарных кавычек, поскольку они также используются оболочкой.

--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().

...