すべてで、それはあなたがストリームで作業している場合は、ストリームで動作するように、好ましくは、継続すべきであるということであるかもしれない場合、私は、あなたが本当に何かが欠けている場合はわかりません。それは何か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))
のように、出力の最後に改行を追加します)。
あなたは私のヒーローアンソンです。その詳細な説明をありがとう、ruamel.yamlに関する皆さんの心からの誠実な献身的な仕事に感謝します。 – rsaw