Вы можете загрузить и выгрузить этот вывод в Python, сохранив шестнадцатеричное значение, используя ruamel.yaml
(отказ от ответственности: я являюсь автором этого пакета Python):
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)
, что дает:
someHexValue: 0xDEF9C64256DEE61EBF5B212238DF11C7E532E3B7
someString: Hello World
someStringWithQuotes: '"Hello World"'
Фактический вывод команды go неправильный, если вы должны вывести строку "0xDef9C64256DeE61ebf5B212238df11C7E532e3B7"
с помощью Python, то вы увидите, что она выводит эту строку с кавычками (здесь я использую ruamel.yaml
, ноэто работает так же для PyYAML):
import sys
import ruamel.yaml
data = dict(someHexValue="0xDef9C64256DeE61ebf5B212238df11C7E532e3B7")
yaml = ruamel.yaml.YAML()
yaml.dump(data, sys.stdout)
, что дает:
someHexValue: '0xDef9C64256DeE61ebf5B212238df11C7E532e3B7'
То, что эта строка нуждается в кавычках, определяется представлением строки "plain" (то есть без кавычек) изатем попытаться разрешить его, чтобы убедиться, что оргинальный тип (строка) возвращается.Это не тот случай, так как он является целым числом, и представительная часть процесса выгрузки решает, что кавычки необходимы.(Если вы когда-нибудь посмотрите на код загрузки и выгрузки и задаетесь вопросом, почему распознаватель используется обоими: по этой причине дамперу также необходим доступ к resolver.py
).
Это работает одинаководля строки типа "True"
и «2019-02-08», которые также заключаются в кавычки (чтобы не «путать» их с логическим значением или датой).
Это довольно дорогой вычислительный процесси, конечно, есть и другие способы определить, нужны ли кавычки.
На ходу это работает аналогичным образом, но в соответствующем коде есть ошибка в resolve.go
:
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
}
}
Из документации для ParseInt
:
Если base == 0, основание подразумевается префиксом строки: base 16 для "0x", base 8 для "0",и основание 10. в противном случае.
Проблема, конечно, заключается в том, что в YAML и Python нет ограничений на размер целого числа. Но в действительности они ограничены 64 битами.ParseInt возвращает ошибку и думает, что строка не нужнапроцитировать.(Я сообщил об этом как ошибка в библиотеке go-yaml).
Функция go Marshall
не имеет флага для принудительного цитированиякак вы можете сделать с настройкой yaml.default_style = '"'` in
ruamel.yaml``.