【问题标题】:Use generator with ruamel.yaml使用带有 ruamel.yaml 的生成器
【发布时间】:2023-03-25 15:00:02
【问题描述】:

我想在我的配置字典中有一堆生成器。所以我尝试了这个:

@yaml.register_class
class UniformDistribution:
    yaml_tag = '!uniform'

    @classmethod
    def from_yaml(cls, a, node):
        for x in node.value:
            if x[0].value == 'min':
                min_ = float(x[1].value)
            if x[0].value == 'max':
                max_ = float(x[1].value)
        def f():
            while True: 
                yield np.random.uniform(min_, max_)
        g = f()
        return g

但是,解析器永远不会返回,因为生成器在内部用于解析引用,例如 &A*A。因此,返回(g,) 之类的方法是一个相当简单的解决方法,但我更喜欢这样的解决方案,我不需要next(config['position_generator'][0]) 中额外且非常混乱的索引0 术语。

有什么想法吗?

【问题讨论】:

    标签: ruamel.yaml


    【解决方案1】:

    这个改编自 a different question 的包装器完全符合我的要求。

    class GeneratorWrapper(Generator):
        def __init__(self, function, *args):
            self.function = function
            self.args = args
    
        def send(self, ignored_arg):
            return self.function(*self.args)
    
        def throw(self, typ=None, val=None, tb=None):
            raise StopIteration
    
    
    @yaml.register_class
    class UniformDistribution:
        yaml_tag = '!uniform'
    
        @classmethod
        def from_yaml(cls, constructor, node):
            for x in node.value:
                value = float(x[1].value)
                if x[0].value == 'min':
                    min_ = value
                if x[0].value == 'max':
                    max_ = value
            return GeneratorWrapper(np.random.uniform, min_, max_)
    

    【讨论】:

      猜你喜欢
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 2020-02-29
      • 2012-03-26
      相关资源
      最近更新 更多