将生成器与 ruamel.yaml 一起使用
Use generator with ruamel.yaml
我想在我的配置指令中有一堆生成器。所以我尝试了这个:
@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
但是,解析器永远不会 returns,因为生成器在内部用于解析引用,例如 &A
和 *A
。因此,返回 (g,)
之类的方法是一个相当简单的解决方法,但我更喜欢一种不需要 next(config['position_generator'][0])
.
中额外且非常混乱的索引 0 项的解决方案
有什么想法吗?
这个改编自 的包装器正是我想要的。
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_)
我想在我的配置指令中有一堆生成器。所以我尝试了这个:
@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
但是,解析器永远不会 returns,因为生成器在内部用于解析引用,例如 &A
和 *A
。因此,返回 (g,)
之类的方法是一个相当简单的解决方法,但我更喜欢一种不需要 next(config['position_generator'][0])
.
有什么想法吗?
这个改编自
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_)