2017-11-16 36 views
1

yaml.load은 파이썬이 수레로로드됩니다. 나는 이것을 무시하는 간단한 방법을 찾을 수 없다.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을 사용할 수 있습니다 : 당신은 default 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('-.')) 

. 그런 다음 리졸버를 사용하는 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