С исправленным кодом с использованием type=list
, sys.argv
и args
отображается как:
1353:~/mypy$ python3 stack56531390.py --list1 [4,5,2] --list2 [3,5,4] -o result
['stack56531390.py', '--list1', '[4,5,2]', '--list2', '[3,5,4]', '-o', 'result']
Namespace(list1=['[', '4', ',', '5', ',', '2', ']'], list2=['[', '3', ',', '5', ',', '4', ']'], outlist='result')
[1, 1]
Обратите внимание, что списки входят как строки. Функция list
разбивает эту строку на список символов.
In [607]: list('astring')
Out[607]: ['a', 's', 't', 'r', 'i', 'n', 'g']
Тот факт, что fun
работает для этих входов, скорее совпадение, а не дизайн. Входы не соответствуют проверенным: a = [4, 5, 2]' and 'b = [3, 5, 4]
.
Посмотрите, что произойдет, если пользователь поместит пробелы в списках:
1355:~/mypy$ python3 stack56531390.py --list1 [4, 5, 2] --list2 [3,5,4] -o result
usage: stack56531390.py [-h] [--list1 LIST1] [--list2 LIST2] -o OUTLIST
stack56531390.py: error: unrecognized arguments: 5, 2]
или кавычки, чтобы сохранить разделенные списки вместе:
1357:~/mypy$ python3 stack56531390.py --list1 "[4, 5, 2]" --list2 [3,5,4] -o result
['stack56531390.py', '--list1', '[4, 5, 2]', '--list2', '[3,5,4]', '-o', 'result']
Namespace(list1=['[', '4', ',', ' ', '5', ',', ' ', '2', ']'], list2=['[', '3', ',', '5', ',', '4', ']'], outlist='result')
[2, 3]
Так что, хотя type=list
можно заставить работать, обычно это не лучший выбор. Помните, argparse type
- это функция, которой присваивается строка; это не спецификатор типа или класса.
Если я изменю два аргумента на *
входные данные типа int:
ap.add_argument('--list1', nargs='*', type=int)
ap.add_argument('--list2', nargs='*', type=int)
1358:~/mypy$ python3 stack56531390.py --list1 4 5 2 --list2 3 5 4 -o result
['stack56531390.py', '--list1', '4', '5', '2', '--list2', '3', '5', '4', '-o', 'result']
Namespace(list1=[4, 5, 2], list2=[3, 5, 4], outlist='result')
[1, 1]
Теперь двумя входными данными являются обычные списки целых чисел, а не те списки символов, которые включают скобки и запятые. Сравнение будет числовым, а не лексическим.