Это неправильно на нескольких уровнях:
Вы используете старый интерфейс ruamel.yaml
и в вашем коде есть и yaml.
, и ruamel.yaml
. Используете ли вы RoundTripLoader с PyYAML?
Ваш ввод недействителен YAML, так как вы не можете иметь скаляр в двойных кавычках ("value1"
), за которым следует другой (вы можете, конечно, в Python). Поскольку вы говорите о «является списком», но на входе нет последовательности, которая могла бы создать список, вы, вероятно, не указали тире.
Вы путаете числа, которые получаете с номерами строк для ключей в ваших различных сопоставлениях. Хотя может быть трудно увидеть, что отсчет начинается с 0, очевидно, если вы введете дополнительную (пустую) строку в поле ввода
Вполне возможно напечатать data['key1']['key3']['key4']['key5'].lc.line
, поскольку это значение является списком (подтипом), хотя это, конечно, номер строки для начала этого списка, а не для key5
, поскольку data['key1']['key2']
является int
Я не понимаю, как вы можете ожидать атрибута, указывающего номер строки для этого типа (для себя или некоторого ключа, если это int
, оказывается, значение dict). Вы когда-нибудь пытались установить атрибут для встроенного класса, например int
? Попробуйте 10.lc = 24
иногда.
import ruamel.yaml
yaml_str = """\
key1:
key2: 10
key3:
key4:
key5:
- "value1"
- "value2"
"""
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
assert isinstance(data['key1']['key2'], int)
print(data['key1'].lc.line) # the starting line number of the value associated with of key1
print(data['key1']['key3'].lc.line) # the starting line number of the value associated with key3
print(data['key1']['key3']['key4'].lc.line) # the starting line number of the value of key4
print(data['key1']['key3']['key4']['key5'].lc.line) # the starting line number of the value of key5
, что дает:
1
4
5
6
Из-за дополнительной строки на входе выходные данные изменяются с 1 3 4 5
на 1 4 5 6
, и должно быть ясно, что то, что вы не получаете, не является номерами строк ни для одного из ключей.
Таким образом, должно быть очевидно, что вы не получаете строку цифры для ключей вообще .
Да, есть способ получить номера строк для всех ключей.
(Если вы понимаете, что хотите знать, как это сделать: вы следует взять эту информацию из всех key_node
присваиваний в методе construct_mapping
класса RoundTripLoader
(это подкласс и предоставить ее экземпляру yaml
перед загрузкой) и присоединить ее к некоторому собственному атрибуту в maptyp
переменная этого метода.)