如何在Python中对yaml.dump中的数字输出进行舍入?

时间:2015-11-26 17:30:34

标签: python python-3.x yaml rounding precision

是否有一种干净的方法来控制export libpath=/path to hbase jar hadoop jar myjarname.jar <classpath> arguments -libjar ${libpath} 的数字舍入输出?例如,我有一个具有不同复杂性变量的类,其中一些是双精度数,我想要四舍五入说第四位数。此yaml.dump输出仅供显示;它将不会被加载(即yaml将不被使用)。

作为一个简单的例子,请考虑以下课程yaml.load

A

带输出

import yaml
class A:
    def __init__(self):
        self.a = 1/7
        self.b = 'some text'
        self.c = [1/11, 1/13, 1/17, 'some more text']

    def __repr__(self):
        return yaml.dump(self)

A()

和期望的输出:

!!python/object:__main__.A
a: 0.14285714285714285
b: some text
c: [0.09090909090909091, 0.07692307692307693, 0.058823529411764705, some more text]

我想这可以用!!python/object:__main__.A a: 0.1429 b: some text c: [0.0909, 0.0769, 0.0588, some more text] 以一种干净的方式完成。 我想避免使用字符串输出的舍入,因为实际的类结构可能更复杂(递归等)。

2 个答案:

答案 0 :(得分:3)

你可以手动围绕它:

#!/usr/bin/env python
import yaml

def float_representer(dumper, value):
    text = '{0:.4f}'.format(value)
    return dumper.represent_scalar(u'tag:yaml.org,2002:float', text)
yaml.add_representer(float, float_representer)

print(yaml.safe_dump([1 / 11, 1 / 13, 1 / 17, 'some more text']))
print(yaml.dump([1 / 11, 1 / 13, 1 / 17, 'some more text']))

输出

[0.09090909090909091, 0.07692307692307693, 0.058823529411764705, some more text]

[0.0909, 0.0769, 0.0588, some more text]

您可能需要为角落案例添加更多代码,请将represent_float()视为@memoselyk suggested

答案 1 :(得分:2)

为浮点数创建自己的 repesenter ,根据需要格式化浮点数,并用yaml.add_representer(float, my_custom_repesenter)替换现有的表示符。

Here你可以找到浮动的默认代表。您可以将该代码作为起点,仅更改值不是[+-].inf.nan的路径,并按下value所需的精度。