2013-05-25 1 views
2

yaml을 사용하여 다른 데이터 유형의 단일 값을 직렬화하는 경우가 자주 있습니다. 나는 PyYAML이 종종 그 문자열의 끝 부분에 '\n' 또는 '\n...\n' 문자열을 추가하는 것을 알아 챘다. 제한된 실험에서 이러한 후행 문자를 제거하는 것이 안전합니다.이 짧은 yaml 출력은 안전합니까?

기본 동작

import yaml, decimal, datetime 
items = ['hello', 3, True, decimal.Decimal('3.2'), datetime.date(2013, 5, 25)] 
for i in items: 
    data = yaml.dump(i) 
    print '%r %r %r' % (i == yaml.load(data), i, data) 

출력됩니다 :

True 'hello' 'hello\n...\n' 
True 3 '3\n...\n' 
True True 'true\n...\n' 
True Decimal('3.2') "!!python/object/apply:decimal.Decimal ['3.2']\n" 
True datetime.date(2013, 5, 25) '2013-05-25\n...\n' 

스트립 특수 후행 문자

import yaml, decimal, datetime 
items = ['hello', 3, True, decimal.Decimal('3.2'), datetime.date(2013, 5, 25)] 
for i in items: 
    data = yaml.dump(i).replace('\n...\n', '').rstrip('\n') 
    print '%r %r %r' % (i == yaml.load(data), i, data) 

출력됩니다 :

True 'hello' 'hello' 
True 3 '3' 
True True 'true' 
True Decimal('3.2') "!!python/object/apply:decimal.Decimal ['3.2']" 
True datetime.date(2013, 5, 25) '2013-05-25' 

두 번째 코드 블록이 안전합니다. 모든 입력 데이터에서 작동합니까? 나는 이것이 깨지는 경우를 찾고있다. 복잡한 중첩 된 입력 데이터로도이 문제가 해결되는 모든 경우에 관심이 있습니다.

답변

1

trailing elipsis은 선택적으로 문서의 끝을 나타내며, 이는 YAML을 자동 구분합니다. 이는 여러 개의 YAML 문서를 같은 스트림에 삽입 할 때 유용하지만, 필요없는 경우 안전하게 제거 할 수 있습니다.

마지막 줄 바꿈은 선택 사항이지만, 일반적인 텍스트 구문 분석 도구는 모든 줄이 줄 바꿈으로 끝나기를 기대합니다. 즉, 전통적인 유닉스 텍스트 처리는 라인 사이에 구분 기호으로 개행을 보지 않고, 현재 행의 인 종결 자로 간주합니다. 종료되지 않은 최종 줄은 별도로 처리되는 예외입니다 (diff의 "파일 끝에 줄 바꾸기 없음"메시지가 떠오름). 종종 버그의 원인이됩니다. 최종 줄 바꿈을 제거 할 수는 있지만, 좋은 이유없이 그렇게하지 않는 것이 좋습니다.