format_version
(и print_version
который использует format_version
) отображает атрибут parser.version
, который можно установить с помощью параметра version
. Но, как писал Мартийн, этот подход к показу версии лишен. Появится предупреждающее сообщение.
Этот аргумент action='version'
принимает другой маршрут. Он имеет свой собственный параметр version
(но с использованием parser.version
в качестве резервной копии). При срабатывании строки аргумента -v
он отображает эту информацию о версии и вызывает выход системы.
Можно еще назвать -v
и избежать выхода системы с Ьгу блока:
try:
p.parse_args(['-V'])
except SystemExit:
pass
Это удобно для тестирования, но не то, что вы хотите в производстве. Кроме того, он захватывает другие выходы, такие как помощь и ошибки.
Как и в случае любого аргумента, вы можете сохранить ссылку на действие и отобразить, использовать или даже изменить его атрибуты.
version_action = parser.add_argument('--version', '-V', action='version',
version="%(prog)s " + __version__)
print version_action
print version_action.version
assert isinstance(version_action, argparse._VersionAction)
Функционально это то же самое, как поиск Мартейн в части parser._get_optional_actions()
, но проще.
Вы могли бы повторить действие _VersionAction.__call__
, без выхода системы с:
def foo(action, parser):
formatter = parser._get_formatter()
formatter.add_text(action.version)
return formatter.format_help()
foo(version_action, parser)
Хотя в данном случае все это делает заполнить %(prog)s
строки.
http://bugs.python.org/issue9399 «Предоставить действие« print »для argparse», обсуждается добавление типа действия «печать» или «запись». Он будет вести себя как «версия», но без выхода системы и, возможно, большего контроля над форматированием и назначением печати.