2011-06-28 13 views
1

私は困惑しています。私は、Pythonで特定のリリースに基づいてファイルを返すようにしたい- マップでどのように型を定義できますか?

release: JULY 
files: 
    # files 
    /foo/config.py:  1.6 
    /bar/dao.py:    1.19 

:として、ここで私は私のドキュメントを構築したいものです。その部分は簡単ですが、浮動小数点として値を返しています。これは問題を引き起こします。私は前処理をせずに文字列にそれらを強制したいと思います。 (私はファイルを開き、バージョンをループし、各エントリに!python/strを付加したくない)

タグはこれを行う方法であると仮定していますが、頭やどのように/私はタグを定義することができますの観点からドキュメントの尾。

任意のポインタ?

+1

数字の前後に引用符を追加する方がやや簡単です。あなたは、少なくともYAMLパーサではなく、魔法のように動作させることはできません.IAML仕様では、\ d + \。\ d +がfloatとして扱われることを要求しています。 – delnan

+0

XMLスキーマのような定義を作成できませんか? – GoingTharn

+0

そのようなものを提供しようとするプロジェクトがあります。 [Kwalify](http://www.kualata-lab.com/kwalify/)。しかし、彼らが型の強制を含む構文解析を提供しているのか、標準のパーサーがそれを解析してスキーマに合致するオブジェクトに解析するのかを調べるだけではわかりません。 – delnan

答えて

0

あなたは文字列としてfloat値をダンプしたい場合は、単に最初にそれらにstr()を呼び出して、文字列の型を指定する必要はありません。

>>> d = {'release': 'JULY', 'files': {'/path/file': str(1.6), '/path/file2': str(1.9)}} 

>>> print yaml.dump(d, default_flow_style=False) 
files: 
    /path/file: '1.6' 
    /path/file2: '1.9' 
release: JULY 

あなたがシリアライズしたい場合は/カスタムデシリアライズオブジェクトには、あなたは自分のクラスで__repr__を定義することで、ある程度のことを行うことができます。

class Foo: 
    def __init__(self, x): 
     self.x = x 
    def __repr__(self): 
     return "%s(%r)" % (self.__class__.__name__, self.x) 

>>> f = Foo(0) 
>>> foo = yaml.dump(f) 
>>> yaml.load(foo) 
<<< Foo(0) 
+0

多分私はYAMLを間違って使っています。私の目標は、ユーザーに構造を与えることでしたし、その文書を解析してさらに操作するためのリストを取得しました。 これと私の他の研究は、エンドユーザーが私のユースケースをひどく破るYAMLの構造体の形式を知っていなければならないことを意味しています。 – GoingTharn

0

それはあなたがこのように、何かをサブクラスLoaderでやるとadd_path_resolverを呼び出すために欲しいもののように見える:

class MyLoader(yaml.Loader): 
    pass 
MyLoader.add_path_resolver(SOME_TAG, SOME_PATH, str) 

f = open('foo.yaml') 
the_data = yaml.load(f, Loader=MyLoader) 

しかし、私はadd_path_resolver上の任意のドキュメントを見つけることができないとSOME_TAGSOME_PATHがどうあるべきか。

+0

動作しません、add_path_resolverは非スカラーに対してのみ有効です:http://stackoverflow.com/questions/3875579/parse-yaml-and-assume-a-certain-path-is-always-a-string/4151152 #4151152 – Tobu

関連する問題