【发布时间】:2013-09-11 02:06:09
【问题描述】:
现在我正在转储到 YAML 文档中。它在大多数情况下都在正常工作。当我尝试转储诸如“0x2A”之类的十六进制时,它会转换为 42。有没有办法保持它的十六进制格式?可悲的是,字符串不会起作用。而 int(0x2A, 16) 也只是给了我一个 42。
【问题讨论】:
现在我正在转储到 YAML 文档中。它在大多数情况下都在正常工作。当我尝试转储诸如“0x2A”之类的十六进制时,它会转换为 42。有没有办法保持它的十六进制格式?可悲的是,字符串不会起作用。而 int(0x2A, 16) 也只是给了我一个 42。
【问题讨论】:
应该这样做:
>>> 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'
【讨论】:
用十六进制格式表示所有int,没有HexInt类,可以使用:
def hexint_presenter(dumper, data):
return dumper.represent_int(hex(data))
yaml.add_representer(int, hexint_presenter)
参考this answer。
【讨论】:
safe_dump 而不是dump,则此解决方案不起作用
您可能正在寻找hex(0x2a) == hex(42) == '0x2a'。
除非您正在寻找一种方法来说服您现有的转储函数使用十六进制而不是十进制表示法...
回答您下面的评论,如果问题是您想要十六进制数字的大写字母(但0x 的小写字母),那么您必须使用字符串格式。您可以选择以下选项之一:
"0x%02X" % 42 # the old way
"0x{:02X}".format(42) == "0x2A" # the new way
在这两种情况下,您都必须显式打印0x,后跟至少两位大写的十六进制数字,如果您的数字只有一位,则左填充零。这由02X 的格式表示,与C 的printf 相同。
【讨论】: