namespace - Python argparse no puede analizar el formato hexadecimal al tipo int
python argparse example (2)
No hay suficiente reputación para comentar sobre la otra respuesta.
Si no desea definir la función auto_int
, encontré que esto funciona muy limpiamente con un lambda.
group.add_argument(''--vid'',
type=lambda x: int(x,0),
help=''vid of DUT'')
Tengo el siguiente código que intenta obtener el DUT VID desde la línea de comandos invocada:
parser = argparse.ArgumentParser(description=''A Test'',
formatter_class=argparse.ArgumentDefaultsHelpFormatter
)
group.add_argument("--vid",
type=int,
help="vid of DUT")
options = parser.parse_args()
Considere la línea de comandos "python test.py --vid 0xabcd". Observo que argparse está generando una excepción en esto, ya que no puede completar la llamada int(''0xabcd'')
porque es la base 16. ¿Cómo puedo hacer que argparse funcione correctamente? ¿maneja esto?
argparse
está buscando crear una conversión de tipo invocable desde el valor de ''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
Por defecto, int()
se establece en base 10. Para poder acomodar los parámetros de base 16 y base 10, podemos habilitar la detección automática de base:
def auto_int(x):
return int(x, 0)
...
group.add_argument(''--vid'',
type=auto_int,
help=''vid of DUT'')
Tenga en cuenta que el tipo de actualización es ''auto_int''
.