2017-12-03 13 views
1

以前は、ruamel.yamlの下位互換性のある部分を使用してsome_fancy_printing_loggin_func(yaml.dump(...), ...)のようなコードを実行しましたが、私のコードを最新のAPIを使用するように変換したい私はいくつかの新しい書式設定を利用することができます。ruamel.yamlを使用してストリームにダンプしないようにする

しかし、ストリームを指定する必要があることが嫌いruamel.yaml.YAML.dump() ...ストリームに直接書き込むことは望ましくありません。出力を呼び出し元に返すだけです。私は何が欠けていますか?

PS:もちろん、私はそれを避けようとしていますが、私は次のようなことをすることができます。

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

関連する問題