python argparse 十六进制错误

python argparse hex error

我正在尝试使用 argparser 读取我的 pythonscript 所需的一些十六进制值,示例输入如下所示:

parser.add_argument("start", type=hex, help="hex PC address you want to start recording data")

当我尝试使用十六进制值启动脚本时出现问题。 示例:

python testscript.py 0x21c

然后 ik 得到错误:

 error: argument start: invalid hex value: '0x21c'

还尝试了以下值:0X21C、21C、21c、21。所有这些都会导致相同的错误。

编辑:我不需要将十六进制值转换为整数。我只需要我输入的十六进制值。它是 µC 需要跳转到的 PC 地址。

有谁知道我在这里做错了什么? 谢谢!

灵感来自:

Convert hex string to int in Python

我试过了

In [471]: parser=argparse.ArgumentParser()

In [472]: parser.add_argument('ahex',type=lambda x: hex(int(x,0)))

In [473]: parser.parse_args(['0x21c'])  # valid hex string input
Out[473]: Namespace(ahex='0x21c')

In [474]: parser.parse_args(['21'])  # converts valid int to hex string
Out[474]: Namespace(ahex='0x15')

In [475]: parser.parse_args(['21c'])   # error if string is not valid hex

usage: ipython3 [-h] ahex
ipython3: error: argument ahex: invalid <lambda> value: '21c'

正如@mgilson 在评论中强调的那样,type 参数是一个 函数,一个接受字符串和return 的东西。如果字符串不是 'valid',它也会引发错误。 hex() 不像 type 那样工作,因为它需要一个整数和 return 一个十六进制字符串。 hex('0x21c') 该函数的使用无效。

对于这个快速解决方案,我使用了 lambda 函数。它也可以是 def。我使用 int(x,0) 以处理十六进制字符串和整数字符串的方式将字符串转换为 int。然后我使用 hex 函数将该整数转换回字符串。

所以我的 lambda 的净效果只是验证十六进制字符串。如果是一个有效的字符串,它只是 return 相同的东西(就好像 type 是默认身份 lambda x: x)。

当人们想要 boolean 值时,最常出现对 type 参数性质的混淆。 bool() 不接受像 'True' 或 'False' 这样的字符串,而 return 是一个布尔值。如果问题仍然令人困惑,请查找这些 SO 问题。