Какова максимальная глубина вложенности в yaml?

#yaml

#yaml

Вопрос:

Я пишу несколько шаблонов yaml для конфигураций, и они начинают иметь много степеней вложенности.

Какова максимально возможная и максимально рекомендуемая глубина вложенности в yaml?

Ответ №1:

Начиная с YAML 1.2, единственное ограничение, налагаемое спецификацией, составляет 1024 символа для неявных ключей:

 foo: bar                                # okay
[ foo ]: bar                            # also okay
<<more-than-1024-characters-here>>: bar # not okay
 

Это запрещено независимо от того, является ли ключ скалярным (первая строка) или узлом сбора (вторая строка). Следовательно, это практически ограничивает вложенность в неявных ключах. Однако вместо этого вы можете просто использовать явные ключи:

 ? foo
: bar
? [ foo ]
: bar
? <<more-than-1024-characters-here>>
: bar
 

Помимо этого, вам не нужно беспокоиться о вложенности, поскольку рукописные файлы вряд ли достигнут пределов, налагаемых реализацией. Конечно, вы могли бы протестировать используемую вами реализацию на предмет ее ограничений, например, PyYAML:

 import yaml, traceback
from yaml.constructor import ConstructorError

for i in range(128, 1024):
    open, close = "", ""
    for j in range(0, i):
        open, close = open   "[", close   "]"

    try: yaml.load(open   close)
    except:
        traceback.print_exc()
        print("failed at depth "   str(i))
        exit(1)
 

Это дает (через некоторое время):

 []
RecursionError: maximum recursion depth exceeded
failed at depth 496
 

Возможная глубина в 495 уровней кажется достаточной.

Ответ №2:

В YAML нет ограничений на вложенность.

Но в программном обеспечении, с которым вы его используете, могут быть ограничения, чаще всего вы столкнетесь с ограничениями памяти или процессора. Я не знаю ни о каких недавних библиотеках, которые имеют жесткие ограничения, если только вы не начнете сталкиваться с ограничениями, возникающими из-за того, что отступы переполняют целое число 😉