Intereting Posts

Преобразование формата Symfony YAML

У меня есть определение службы, которое выглядит так:

MyService: class: Some\Class\Here factory: - SomeFactoryHere - method calls: - [add, ["@=service('AnotherService1').create(service('AnotherService2'), service('AnotherService3'), service('AnotherService3'))"]] 

IMHO, это может быть более читаемым, если оно преобразуется в нечто вроде этого:

 MyService: class: Some\Class\Here factory: - SomeFactoryHere - method calls: - add, "@=service('AnotherService1').create( service('AnotherService2'), service('AnotherService3'), service('AnotherService3') )" 

Но это недействительно. YAML (синтаксический анализатор Symfony не работает), и мой вопрос заключается в том, как эта конфигурация может быть преобразована в нечто подобное выше?

UPD # 1

Посмотрите на преобразование формата Symfony YAML: «вызовы» со строковыми параметрами – существуют важные нюансы.

Лучший способ разбить строку

 "@=service('AnotherService1').create(service('AnotherService2'), service('AnotherService3'), service('AnotherService3'))" 

с помощью раздвоенного сложенного скалярного блока . Ограничением для этого является то, что вы не можете избежать каких-либо специальных символов с обратными косыми чертами, но это не в вашем примере (причина, по которой вам нужно "" вокруг вашего скаляра», потому что она начинается с @ который является зарезервированным символом).

Затем вам также необходимо правильно представить структуру, которую у вас есть, как уже указывал @flyx: значение для calls – это последовательность, первый элемент которой представляет собой список скалярных add и последовательность, состоящую из вышеупомянутого длинного скаляра, который вы хотите разбить на читаемость:

 import yaml yaml_str = """\ MyService: class: Some\Class\Here factory: - SomeFactoryHere - method calls: - - add - - >- @=service('AnotherService1').create( service('AnotherService2'), service('AnotherService3'), service('AnotherService3')) """ data = yaml.safe_load(yaml_str) print(data) 

дает:

 "@=service('AnotherService1').create( service('AnotherService2'), service('AnotherService3'), service('AnotherService3'))" 

Обратите внимание, что это дает дополнительное пространство между .create( и service( .

Анализатор YAML, который использует Symphony, кажется, не может разобрать выше (хотя это правильно). Вы также можете попробовать:

 MyService: class: Some\Class\Here factory: - SomeFactoryHere - method calls: - - add - - >- @=service('AnotherService1').create( service('AnotherService2'), service('AnotherService3'), service('AnotherService3')) 

То, что вы написали, действительно YAML. Если синтаксический анализатор Symfony выходит из строя, у него есть ошибка. Но в любом случае второй YAML не представляет ту же структуру, что и первый YAML.

В первом YAML calls представляют собой последовательность. Первый элемент последовательности calls также представляет собой последовательность, которая содержит скалярную add и еще одну последовательность. Во втором YAML calls также являются последовательностью, но элемент, который он содержит, является скаляром, который содержит все, начиная с add, to )" . Запятая здесь, потому что вы не начали последовательность потока (с [ ). блочный YAML, который эквивалентен первому YAML:

 MyService: class: Some\Class\Here factory: - SomeFactoryHere - method calls: - - add - - "@=service('AnotherService1').create(\ service('AnotherService2'), service('AnotherService3'), service('AnotherService3')\ )" 

Обратные косые черты в конце строк строки не вставляют пробелы. По умолчанию YAML вставляет один пробел для каждой новой строки в двойную кавычку, с которой он сталкивается. Этот скаляр YAML дает точно такую ​​же строку, что и ваш первый YAML.

- - это компактный стиль, который запускает сразу два вложенных элемента последовательности. Итак, теперь calls – это последовательность с последовательностью в качестве первого элемента. что вложенная последовательность содержит скалярную add как первый элемент, а другую – второй. И эта последовательность содержит двухкабельный скаляр.