0

Python のような動的言語では、YAML マッピングをオブジェクトに簡単に変換できることがわかっています。これは非常に強力な機能であり、多くのコーディングを節約できます。

.yamlファイルをオブジェクトにマップしようとすると、問題が発生します。

ファイル: objtest.yaml

---
  test: yaml test   
  option: this is option
...

私のコード:

class MyTest(object):
    pass

testObj = MyTest()

f = open(os.path.join(os.path.dirname(__file__), 'objtest.yaml'))

rawData = yaml.safe_load(f)

print rawData

testObj.__dict__ = yaml.load(f)

f.close()

print testObj

STDOUT (トレースバックあり):

{'test': 'yaml test', 'option': 'this is option'}
Traceback (most recent call last):
  File "C:/CROW/ATE/Workspace/Sandbox/test.py", line 23, in <module>
    testObj.__dict__ = yaml.load(f)
TypeError: __dict__ must be set to a dictionary, not a 'NoneType'

質問:

ご覧のとおり、ファイルはロードされていますが、ファイルをロードしようとするとrawDataクラスインスタンスtestObjに問題があり.yamlます。

私が間違っていることはありますか?

4

2 に答える 2

1

rawData = yaml.safe_load(f)つまり、後者はファイルyaml.load(f)からそれ以上データを読み取ることができません。シーク ポインターを巻き戻すことはできますが、次のことを行う理由はまったくありません: YAML ドキュメントは既に (より安全な方法で) ロードされています。するだけですtestObj.__dict__ = rawData

とはいえ、 への割り当てについては留保があり__dict__ます。実装定義である場合とそうでない場合があり、いずれにせよハッキングの匂いがします。検証はゼロであり、無効なデータは型エラーまたは属性エラー (または のYAML.load代わりにsafe_load、サイレント セキュリティ違反を含む任意の他のエラーでさえ) につながり、YAML ファイルに問題があることを示すものはありません。適切なシリアル化ライブラリは、長期的にはより堅牢で保守しやすい選択肢です。

于 2013-11-05T13:55:01.500 に答える
0

何をしようとしているのか正確にはわかりません... http://pyyaml.org/wiki/PyYAMLDocumentationのコンストラクタ、リプレゼンタ、リゾルバのセクションの途中まで見てください。オブジェクトをロードできるようにしたい場合は、そのオブジェクトの SafeRepresenter と SafeConstructor を作成する必要があります。

于 2013-11-05T14:02:56.663 に答える