web-dev-qa-db-ja.com

Python argparseは16進フォーマットをint型に解析できません

呼び出されたコマンドラインからDUTVIDを取得しようとする次のコードがあります。

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

コマンドライン「pythontest.py--vid 0xabcd」について考えてみます。これは、基数16であるため、int('0xabcd')の呼び出しを完了できないため、argparseが例外を発生させていることに気付きました。これを正しく処理しますか?

20
devanl

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'_に更新されていることに注意してください。

30
devanl

他の答えにコメントするのに十分な評判がありません。

auto_int関数を定義したくない場合は、これがラムダで非常にきれいに機能することがわかりました。

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