<p>您可以在使用<code>ruamel.yaml</code>保留十六进制值的同时加载和转储该输出(免责声明:我是该Python包的作者):</p>
<pre><code>import sys
import ruamel.yaml
yaml_str = """\
someHexValue: 0xDef9C64256DeE61ebf5B212238df11C7E532e3B7
someString: Hello World
someStringWithQuotes: '"Hello World"'
"""
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)
</code></pre>
<p>它给出了:</p>
^{pr2}$
<hr/>
<p>go的实际输出是不正确的,如果使用Python输出字符串<code>"0xDef9C64256DeE61ebf5B212238df11C7E532e3B7"</code>,那么您将看到它输出
带引号的字符串(我在这里使用<code>ruamel.yaml</code>,但这对PyYAML是一样的):</p>
<pre><code>import sys
import ruamel.yaml
data = dict(someHexValue="0xDef9C64256DeE61ebf5B212238df11C7E532e3B7")
yaml = ruamel.yaml.YAML()
yaml.dump(data, sys.stdout)
</code></pre>
<p>它给出了:</p>
<pre><code>someHexValue: '0xDef9C64256DeE61ebf5B212238df11C7E532e3B7'
</code></pre>
<p>通过表示
字符串“plain”(即没有引号),然后尝试解析它
以确保返回原始类型(字符串)。这不是
当它被发现是一个整数和
倾销过程决定了报价是必要的。(如果你看的话
在加载和转储代码时,不知道为什么要使用解析器
这就是转储程序需要访问<code>resolver.py</code>as的原因
好吧)。在</p>
<p>这对于<code>"True"</code>和“2019-02-08”这样的字符串也是一样的,它们也被引用(按顺序
不要用布尔值或日期来“混淆”它们)。在</p>
<p>这是一个相当昂贵的计算过程,当然还有其他方法
决定是否需要引用。在</p>
<p>在go中,这是以相同的方式工作的,但是<code>resolve.go</code>中的相关代码中有一个错误:</p>
<pre><code> intv, err := strconv.ParseInt(plain, 0, 64)
if err == nil {
if intv == int64(int(intv)) {
return yaml_INT_TAG, int(intv)
} else {
return yaml_INT_TAG, intv
}
}
</code></pre>
<p>来自<code>ParseInt</code>的文档:</p>
<blockquote>
<p>If base == 0, the base is implied by the string's prefix: base 16 for "0x", base 8 for "0", and base 10 otherwise. </p>
</blockquote>
<p>问题当然是在YAML和in中没有限制
一个整数大小的Python。但在围棋比赛中被限制在64人以内
位。所以在上面的ParseInt返回一个错误,go认为
字符串不需要引用。(我以
<a href="https://github.com/go-yaml/yaml/issues/435" rel="nofollow noreferrer">bug</a>即兴表演
图书馆)。在</p>
<p>去<a href="https://godoc.org/gopkg.in/yaml.v2#Marshal" rel="nofollow noreferrer">^{<cd8>}</a>
函数似乎没有一个可以强制引用的标志
执行设置<code>yaml.default_style = '"'` in</code>拉梅尔亚姆勒``. 在</p>