Я использую следующий простой код для разбора некоторых аргументов; обратите внимание, что один из них требуется. К сожалению, когда пользователь запускает сценарий без предоставления аргумента, отображаемый текст использования / справки не указывает на наличие необязательного аргумента, который я нахожу очень запутанным. Как я могу получить Python, чтобы указать, что аргумент не является необязательным?
Вот код:
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Foo')
parser.add_argument('-i','--input', help='Input file name', required=True)
parser.add_argument('-o','--output', help='Output file name', default="stdout")
args = parser.parse_args()
print ("Input file: %s" % args.input )
print ("Output file: %s" % args.output )
При выполнении кода выше без предоставления обязательного аргумента я получаю следующий вывод:
usage: foo.py [-h] -i INPUT [-o OUTPUT]
Foo
optional arguments:
-h, --help show this help message and exit
-i INPUT, --input INPUT
Input file name
-o OUTPUT, --output OUTPUT
Output file name
-i INPUT
деталь не заключена в квадратные скобки, что указывает на то, что действительно требуется. Кроме того, вы можете вручную объяснить это черезhelp
параметрoptional arguments
для требуемых аргументов по-прежнему вводит в заблуждение.Ответы:
Параметры, начинающиеся с
-
или--
обычно считаются необязательными. Все остальные параметры являются позиционными параметрами и, как таковые, требуются при разработке (например, аргументы позиционной функции). Можно требовать необязательные аргументы, но это немного противоречит их замыслу. Так как они все еще являются частью непозиционных аргументов, они все равно будут перечислены под вводящим в заблуждение заголовком «необязательные аргументы», даже если они необходимы. Отсутствующие квадратные скобки в части использования показывают, что они действительно необходимы.Смотрите также документацию :
При этом заголовки «позиционные аргументы» и «необязательные аргументы» в справке генерируются двумя группами аргументов, в которые автоматически разделяются аргументы. Теперь вы можете «взломать его» и изменить имя дополнительных, но гораздо более элегантным решением будет создание другой группы для «требуемых именованных аргументов» (или как вы хотите их называть):
источник
parser.parse_args([])
вместо этого используйтеparser.parse_args()
без аргументов для захвата содержимого sys.argv. Per argparseТак как я предпочитаю перечислять обязательные аргументы перед необязательными, я взломаю их через:
и это выводит:
Я могу жить без «помощи», появляющейся в группе необязательных аргументов.
источник
Здание от Карла Росаена
и это выводит:
источник
_action_group
без доступа к защищенному члену? В моем случае мне нужно добавить некоторый аргумент в уже существующую (пользовательскую) группу.Еще раз, построение @RalphyZ
Этот не нарушает выставленный API.
Который будет показывать то же, что и выше, и должен выжить в будущих версиях:
источник
_action_groups
предназначен только для внутреннего использования. Таким образом, нет гарантии совместимости между версиями.