现在我正在转入YAML文档。它在大多数情况下应该正常工作。当我尝试转储像“0x2A”这样的十六进制时,它会转换为42.是否有任何方法可以保持它的十六进制格式?一个字符串不会悲伤地工作。而int(0x2A,16)也只给我一个42。
答案 0 :(得分:10)
这应该这样做:
>>> import yaml
>>> class HexInt(int): pass
...
>>> def representer(dumper, data):
... return yaml.ScalarNode('tag:yaml.org,2002:int', hex(data))
...
>>> yaml.add_representer(HexInt, representer)
>>> yaml.dump({"n": HexInt(42)})
'{n: 0x2a}\n'
答案 1 :(得分:2)
可以使用以下内容完成以十六进制格式表示所有int
而不使用HexInt
类:
def hexint_presenter(dumper, data):
return dumper.represent_int(hex(data))
yaml.add_representer(int, hexint_presenter)
参考this answer。
答案 2 :(得分:1)
您可能正在寻找hex(0x2a) == hex(42) == '0x2a'
。
除非您正在寻找一种方法来说服现有的转储函数使用十六进制而不是十进制表示法...
回答下面的评论,如果问题是你想要十六进制数字的大写字母(但是0x
的小写字母)那么你必须使用字符串格式。您可以选择以下其中一项:
"0x%02X" % 42 # the old way
"0x{:02X}".format(42) == "0x2A" # the new way
在这两种情况下,您都必须明确打印0x
,然后是大写的至少两位数的十六进制数字,如果您的数字只有一位数,则左边填充零。这由格式02X
表示,与C printf
中的格式相同。