#X 格式说明符真的应该使“0x”前缀大写吗?

PiC*_*CTo 6 python

我试图使用#X格式说明符使用大写字母作为“数字”打印十六进制值,同时自动添加通常的0x前缀。例如,十进制10应表示为0xA

但是,该说明符似乎并非如此:

>>> print(f'{10:#X}')
0XA
>>> '{:#X}'.format(10)
'0XA'
Run Code Online (Sandbox Code Playgroud)

看起来X修饰符使数字(包括前缀)的整个字符串表示0x通过str.upper而不是“数字部分”。我认为这足够公平,但是在检查Format Specification Mini-Language 之后,它看起来可能不是预期的结果(或者,至少,它没有明确记录)。以下是相关位:

'#'选项会导致使用“替代形式”进行转换。[...] 对于整数,当使用 [...] 十六进制输出时,此选项将前缀 [...] 添加'0x'到输出值。

[...]

可用的整数表示类型有:

类型 意义
[...] [...]
'x' 十六进制格式。输出以 16 为基数的数字,9 以上的数字使用小写字母。
'X' 十六进制格式。输出以 16 为基数的数字,对 9 之上的数字使用大写字母
[...] [...]

这似乎意味着大写字母应该只用于非十进制的十六进制数字 ( a, b, c, d, e, f),因此不应关注x(from 0x);那正确吗?

Luk*_*ke_ 1

正如您已经注意到的,#X 使所有内容大写,#x 使所有内容小写。如果您希望 0x 小写,其余大写,那么您可以尝试这样的操作:

# will print 0xA
print(f'{10:#X}'.replace('0X', '0x'))
Run Code Online (Sandbox Code Playgroud)

在我看来,将 0x 中的 x 大写是愚蠢的,他们不应该以这种方式实现它,但事实就是如此......

编辑: 您可以删除 #,然后它将完全删除 0x,然后您可以在格式字符串中手动添加 0x,我认为这是最好的方法:

print(f"0x{10:X}")
Run Code Online (Sandbox Code Playgroud)