2017-11-16 24 views
1

yaml.loadは、Pythonが浮動小数点数としてロードされます。私はこれを無効にする簡単な方法を見つけることができません。pyyamlロード番号(小数値)

json.loadを比較すると、浮動小数点数をdecimal.Decimalとして解析する場合はparse_float=Decimalとなります。

PyYAMLでこれを達成する方法はありますか?または、これはYAML仕様のいくつかの特性によってはお勧めできませんか?

def decimal_constructor(loader, node): 
    value = loader.construct_scalar(node) 
    return Decimal(value) 

yaml.add_constructor(u'!decimal', decimal_constructor) 

これは、あなたが小数を読み込むことができますが、のみを彼らはYAML文書の!decimalタグが付いている場合:

答えて

1

あなたのような何かを行うことができます。ただし、!decimalにすべての数字を解決するために、カスタムResolverを使用することができます。

class MyResolver(BaseResolver): 
    pass 

MyResolver.add_implicit_resolver(
     '!decimal', 
     re.compile(r'''^(?:[-+]?(?:[0-9][0-9_]*)\.[0-9_]*(?:[eE][-+][0-9]+)? 
        |\.[0-9_]+(?:[eE][-+][0-9]+)? 
        |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]* 
        |[-+]?\.(?:inf|Inf|INF) 
        |\.(?:nan|NaN|NAN))$''', re.X), 
     list('-.')) 

あなたはdefault resolverから他の暗黙のリゾルバをコピーする必要があります。次に、リゾルバを使用するLoaderを定義する必要があります。

class MyLoader(Reader, Scanner, Parser, Composer, SafeConstructor, MyResolver): 
    def __init__(self, stream): 
     Reader.__init__(self, stream) 
     Scanner.__init__(self) 
     Parser.__init__(self) 
     Composer.__init__(self) 
     SafeConstructor.__init__(self) 
     MyResolver.__init__(self) 

以上、デフォルトのローダーにコンストラクタを追加しました。その行を変更します。

yaml.add_constructor(u'!decimal', decimal_constructor, MyLoader) 

最後に、それが動作

yaml.load(stream, MyLoader) 
+0

を使ってYAMLをロード!ありがとうございました!作業実績証明書:https://gist.github.com/jpassaro/4d5812290cdca51a8d3fe03c499d4149 – jsharp

関連する問題