2017-12-03 12 views
1

이전에는 ruamel.yaml의 하위 호환성 부분을 사용하여 some_fancy_printing_loggin_func(yaml.dump(...), ...)과 같은 작업을 수행했지만 최신 API를 사용하도록 코드를 변환하고 싶습니다 새로운 서식 설정 중 일부를 활용할 수 있습니다.ruamel.yaml을 사용하여 스트리밍하지 말고 문자열로 덤프하십시오.

그러나 스트림을 지정해야한다는 것을 싫어합니다. ruamel.yaml.YAML.dump() ... 스트림에 직접 쓰고 싶지 않습니다. 출력을 호출자에게 반환하기 만하면됩니다. 내가 뭘 놓치고 있니?

추신 : 나는 다음과 같은 것을 할 수 있음을 알고있다. 물론 나는 그것을 피하려고 노력하고있다. 당신이 스트림과 함께 작업하는 경우 스트림 작업을-바람직-계속해야 할 수도 있습니다 모든 경우에 당신이 정말로 뭔가를 누락하는 경우

f = io.StringIO() 
yml.dump(myobj, f) 
f.seek(0) 
my_logging_func(f.read()) 

답변

3

나는 확실하지 않다. 즉 뭔가 ruamel.yaml 및 PyYAML의 많은 사용자를 그리워하는 것 때문에 그들이 그러나입니다 : 대신

print(dump(data)) 

dump(data, sys.stdout) 

전자는에 사용되는 비 사실적인 데이터 잘 될 수있다 (PyYAML) 문서화를 사용하지만 실제 데이터에 나쁜 습관을 갖습니다.

가장 좋은 해결책은 my_logging_func() 스트림을 지향하는 것입니다. 이는 예를 들어. 다음과 같이 수행 할 수 :

user: rsaw 
question: 47614862 

을하지만, 한 번에 한 줄에서 작업해야하는 경우 MyLogger.write() (이 경우 8 번)를 여러 번 호출되는 점에 유의하고, : 제공

import sys 
import ruamel.yaml 

data = dict(user='rsaw', question=47614862) 

class MyLogger: 
    def write(self, s): 
     sys.stdout.write(s.decode('utf-8')) 

my_logging_func = MyLogger() 
yml = ruamel.yaml.YAML() 
yml.dump(data, my_logging_func) 

라인 버퍼링을해야합니다.

비 스트리밍 인터페이스를 래핑 할 수 있지만 항상 편리한 것은 아닙니다. ruamel.yaml<=0.15.34에서 transform 인수를 남용 할 수 있습니다. 이 인수는 YAML 문서의 전체 문자열 표현 (이전 API가 문자열을 반환하므로 비효율적이므로)에 전달되는 함수를 기대하며 변형 된 문자열을 반환하여 스트리밍해야합니다. 당신이 스트림 싱크 할 경우, 함수의 반환 값을 걱정하지 않아도 :

import sys 
import ruamel.yaml 

data = dict(user='rsaw', question=47614862) 

def my_logging_func(s): 
    print(s, end='') 

class NullStream: 
    def write(self, s): 
     pass 

yml = ruamel.yaml.YAML() 
yml.dump(data, NullStream(), transform=my_logging_func) 

이 같은 출력을 얻을 수 있습니다. ruamel.yaml>0.15.34

, 당신은 transform 매개 변수를 제공하는 가정, 당신은 스트림으로 None를 제공 할 수

import sys 
import ruamel.yaml 

data = dict(user='rsaw', question=47614862) 

def my_logging_func(s): 
    print(s, end='') 

yml = ruamel.yaml.YAML() 
yml.dump(data, None, transform=my_logging_func) 

그리고 당신도 할 이상을 남용 할 수있는 :

import ruamel.yaml 

data = dict(user='rsaw', question=47614862) 

yml = ruamel.yaml.YAML() 
yml.dump(data, None, transform=print) 

를 (하지만 것 예전의 print(dump(data))처럼 출력 끝 부분에 새로운 개행 문자를 넣으십시오.)

+0

당신은 내 영웅 안톤입니다. 자세한 설명을 해주셔서 감사 드리며 ruamel.yaml에 대한 모든 양심적 인 헌신적 인 노력에 감사드립니다. – rsaw