我希望能夠在yaml中定義模式,使用pyyaml
讀取它,然後使用voluptuous
(或其他模式驗證程序)進行驗證! 。然而,正如問題標題所述,我遇到需要將內建類str
實例化爲性感而不是字符串表示。從字符串名稱中創建(實例化?)對內置類型的引用
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}})
我也知道你可以實例化一個emp TY類:
class foo: pass
globals()['foo']
但隨着建宏這是不可能的:
globals()['int']
# KeyError: 'int'
我探討了new
和type
模塊,但沒有任何運氣...
謝謝,看到我對第二個答案的評論。有沒有一種方法可以避免文檔的完整漫遊,並通過'pyyaml'中的工具進行替換? – Justin
@Justin我現在很害怕,看編輯。 – delnan
完美,謝謝!爲了安全起見,我想我會去TYPES路線的'dict'。 – Justin