У меня есть определение службы, которое выглядит так:
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
как первый элемент, а другую – второй. И эта последовательность содержит двухкабельный скаляр.