2016-06-12 1 views

답변

1

당신은 CONST_MY_KEY 어디의 & 객체 ""에 대한 앵커로이 소개 정의하지 않습니다

다음은 https://learnxinyminutes.com/docs/yaml/에서 설명 발췌 한 것입니다. 별칭을 지정하려면 *을 사용하여 YAML 파일의 나중 단계에서 이것을 다시 사용할 수 있습니다 : *CONST_MY_KEY.

앵커 및 별칭에 대한 이유는 @ smartcaveman의 대답은 표시 등의 내용을 복제하지입니다. represent a node in multiple locations in the representation graph입니다. 이 기능없이

도 다음과 같은 간단한 파이썬 구조가 덤프 할 수 없습니다

data = dict(a=1) 
data['b'] = data 

이 위를 덤프 경우 :

import sys 
import ruamel.yaml 

ruamel.yaml.round_trip_dump(data, sys.stdout) 

당신이 얻을 것이다 :

&id001 
a: 1 
b: *id001 

사용하는 언어와 YAML 파서에 따라 스칼라에 앵커를 사용하는 것은 유용하지 않을 수 있습니다. 나중에 실제로 같은 개체를 참조하는 컬렉션 (매핑, 시퀀스)을 사용하지 않고도 값을 반복해야합니다. 또 파이썬에서 더 많은 인기를 파서에 의해 스칼라의 로딩은 별도의 기관에서 수행한다 : 대부분의 (data['b']의 값이 때문에 변경되지 않습니다

a '' 
b '' 
a 'hello' 
b '' 

참고 :

import ruamel.yaml 

yaml_str = """\ 
a: &CONST_MY_KEY "" 
b: *CONST_MY_KEY 
""" 

data = ruamel.yaml.round_trip_load(yaml_str) 
print('a {a!r}'.format(**data)) 
print('b {b!r}'.format(**data)) 
data['a'] = 'hello' 
print('a {a!r}'.format(**data)) 
print('b {b!r}'.format(**data)) 

당신에게 제공 파서) 스칼라는 참조 된 객체로 생성되지 않습니다.

원래 예와 그렇게 할 경우

import ruamel.yaml 

yaml_str = """\ 
&id001 
b: *id001 
a: 1 
""" 

data = ruamel.yaml.round_trip_load(yaml_str) 
print('a {a!r}'.format(**data)) 
data['b']['a'] = 2 
print('a {a!r}'.format(**data)) 

때문에 data['a']data['b']['a'] 실제로 같은 객체이며, 하나를 변경하면 다른 변경됩니다.

<<: *name의 사용은 비표준 YAML 확장입니다. &name은 별칭이 사용되는 매핑에 키 - 값 쌍이 추가되는 매핑의 앵커가 될 것으로 예상합니다.

+0

'MYKey'는 무엇입니까? – fastcodejava

+1

@fastcodejava :'MYKey'는 일반적인 스칼라이며, 값 "" "'의 키 역할을합니다. 앵커 'CONST_MY_KEY'를 정의 할 필요는 없지만 여러 앵커를 정의하려면 매핑 (또는 시퀀스)을 포함 할 컬렉션이 필요합니다. – Anthon

1

이것은 앵커 (anchor)로 알려진 YAML 구조체이며 스 ger거에만 국한되지 않습니다.

작성한 코드는 실제로 앵커 CONST_MY_KEY을 빈 문자열로 정의합니다. & -prefix는 정의중인 것을 나타냅니다. 이 앵커를 나중에 문서에서 재사용하려면 *CONST_MY_KEY 대신 * -prefix를 사용하여 참조하십시오.

# YAML also has a handy feature called 'anchors', which let you easily duplicate 
# content across your document. Both of these keys will have the same value: 
anchored_content: &anchor_name This string will appear as the value of two keys. 
other_anchor: *anchor_name 

# Anchors can be used to duplicate/inherit properties 
base: &base 
    name: Everyone has same name 

foo: &foo 
    <<: *base 
    age: 10 

bar: &bar 
    <<: *base 
    age: 20 
+1

인용 한 병합 확장은 일부 YAML 파서에서만 구현되며 YAML 표준의 일부가 아닙니다 (표준을 작성한 사람들이 정의했지만). 키에 대한 매핑과 해당 값에 대한 앵커에 동일한 이름을 사용하면 (예 : 일관되게) 관계가 있다고 사람들이 혼란스럽게 만드는 경우가 있습니다. ** 좋은 예는 항상 해당 엔터티에 대해 서로 다른 스칼라를 사용합니다. – Anthon

+0

MYKey는 어떤가요? – fastcodejava

관련 문제