我希望能够在 yaml 中定义一个模式,在使用中读取它,pyyaml
然后使用voluptuous
(或其他模式验证器!)进行验证。但是,正如问题标题中所述,我遇到了需要为str
voluptuous 实例化内置类而不是它的字符串表示形式。
from voluptuous import Schema
import yaml
y = '''
a: str
b: int
c:
d: float
e: str
'''
yaml_schema = yaml.load(y,
Loader=yaml.CLoader)
schema1 = Schema(yaml_schema, required=True)
但是,此模式现在正在寻找字符串str
作为 的唯一可接受的值a
。使用直接 pyyaml(例如 'a': !!python/int)失败。相反,我想要下面的架构:
schema2 = Schema({'a': str,
'b': int,
'c': {'d': float,
'e': str}},
required=True)
我很清楚这eval
不是生产解决方案,但evaler
下面的功能将转换schema1
为schema2
...
def evaler(d):
out = {}
for k, v in d.items():
if isinstance(v, dict):
out[k] = evaler(v)
else:
out[k] = eval(v)
return out
## Tests:
## passing
v.Schema(evaler(yaml_schema),
required=True)({'a': 'foo',
'b': 2,
'c': {'d': 2.0,
'e': 'bar'}})
## failling
v.Schema(evaler(yaml_schema),
required=True)({'a': 3,
'b': 2,
'c': {'d': 2.0,
'e': 1}})
我也知道你可以实例化一个空类:
class foo: pass
globals()['foo']
但是使用内置函数这是不可能的:
globals()['int']
# KeyError: 'int'
我探索了new
andtype
模块,但没有任何运气......