2

现在我正在转储到 YAML 文档中。它在大多数情况下都在正常工作。当我尝试转储诸如“0x2A”之类的十六进制时,它会转换为 42。有没有办法保持它的十六进制格式?可悲的是,字符串不会起作用。而 int(0x2A, 16) 也只给了我一个 42。

4

3 回答 3

11

这应该这样做:

>>> 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'
于 2013-09-09T14:31:30.673 回答
2

可以使用以下方法int以十六进制格式表示所有内容,无需类:HexInt

def hexint_presenter(dumper, data):
    return dumper.represent_int(hex(data))
yaml.add_representer(int, hexint_presenter)

参考这个答案

于 2017-02-28T09:18:57.383 回答
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

于 2013-09-06T21:27:01.317 回答