Используйте генератор с ruamel.yaml - PullRequest
0 голосов
/ 27 марта 2020

Я хотел бы иметь кучу генераторов в моем config dict. Поэтому я попробовал это:

@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,) - это довольно простой обходной путь, но я бы предпочел решение, в котором мне не нужен дополнительный и очень запутанный член индекса 0 в next(config['position_generator'][0]).

Любые идеи?

1 Ответ

0 голосов
/ 27 марта 2020

Эта оболочка адаптирована из другой вопрос сделал именно то, что я искал.

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_)
...