Python argparse не выполняет синтаксический анализ шестнадцатеричного форматирования до типа int

У меня есть следующий код, который пытается получить идентификатор DUT из вызываемой командной строки:

parser = argparse.ArgumentParser(description='A Test',
                                 formatter_class=argparse.ArgumentDefaultsHelpFormatter
                                 )
group.add_argument("--vid",
                   type=int,
                   help="vid of DUT")
options = parser.parse_args()

Рассмотрим командную строку "python test.py --vid 0xabcd" Я заметил, что argparse создает исключение, поскольку он не выполняет вызов int('0xabcd'), потому что он является базой 16. Как мне получить argparse, чтобы правильно это обработать?

Ответ 1

argparse пытается создать преобразование вызываемого типа из значения 'type':

    def _get_value(self, action, arg_string):
        type_func = self._registry_get('type', action.type, action.type)
        if not _callable(type_func):
            msg = _('%r is not callable')
            raise ArgumentError(action, msg % type_func)

        # convert the value to the appropriate type
        try:
            result = type_func(arg_string)

        # ArgumentTypeErrors indicate errors
        except ArgumentTypeError:
            name = getattr(action.type, '__name__', repr(action.type))
            msg = str(_sys.exc_info()[1])
            raise ArgumentError(action, msg)

        # TypeErrors or ValueErrors also indicate errors
        except (TypeError, ValueError):
            name = getattr(action.type, '__name__', repr(action.type))
            msg = _('invalid %s value: %r')
            raise ArgumentError(action, msg % (name, arg_string))

        # return the converted value
        return result

По умолчанию int() установлен на базу 10. Для того, чтобы согласовать параметры базы 16 и базы 10, мы можем включить автоматическое определение базы:

    def auto_int(x):
        return int(x, 0)
    ...
    group.add_argument('--vid',
                       type=auto_int,
                       help='vid of DUT')

Обратите внимание, что типом обновления является 'auto_int'.

Ответ 2

Недостаточно репутации, чтобы прокомментировать другой ответ.

Если вы не хотите определять функцию auto_int, я обнаружил, что это работает очень хорошо с помощью лямбда.

group.add_argument('--vid',
                   type=lambda x: int(x,0),
                   help='vid of DUT')