У меня есть некоторое определение сервиса, которое выглядит так:
MyService:
class: Some\Class\Here
factory:
- SomeFactoryHere
- method
calls:
- [add, ["@=service('AnotherService1').create(service('AnotherService2'), service('AnotherService3'), service('AnotherService3'))"]]
ИМХО, это может быть более читабельным, если преобразовать в нечто вроде этого:
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,
в )"
, Запятая здесь содержательна, потому что вы не запустили последовательность потока (с [
). Вот блочный стиль 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
в качестве первого элемента, а другая последовательность в качестве второго элемента. И эта последовательность содержит скаляр в двойных кавычках.