我想用https://github.com/alecthomas/voluptuous验证一个sqlalchemy.util._collections.result
。
我知道sqlalchemy.util._collections.result
是棘手的对象。它们类似于命名元组,但并不是真正的命名元组。
这是我所拥有的:
schema = Schema((str, str, str))
my_result = fancy_function()
schema(my_result)
result
的类型为sqlalchemy.util._collections.result
。
这是我得到的例外:
def validate_sequence(path, data):
if not isinstance(data, seq_type):
raise er.SequenceTypeInvalid('expected a %s' % seq_type_name, path)
# Empty seq schema, allow any data.
if not schema:
if data:
raise er.MultipleInvalid([
er.ValueInvalid('not a valid value', [value]) for value in data
])
return data
out = []
invalid = None
errors = []
index_path = UNDEFINED
for i, value in enumerate(data):
index_path = path + [i]
invalid = None
for validate in _compiled:
try:
cval = validate(index_path, value)
if cval is not Remove: # do not include Remove values
out.append(cval)
break
except er.Invalid as e:
if len(e.path) > len(index_path):
raise
invalid = e
else:
errors.append(invalid)
if errors:
raise er.MultipleInvalid(errors)
if _isnamedtuple(data):
> return type(data)(*out)
E TypeError: __new__() takes 2 positional arguments but 3 were given
我也尝试过这样的事情:
NT = namedtuple('NT', ["name", "f1", "f2", "f3"])
schema = Schema(NT(str, str, str))
但是我得到了相同的输出。
你有什么主意吗?我可以将sqlalchemy结果转换为元组(它可以工作),但是我想在单元测试中使用此验证,因此,我想避免尽可能多地更改要测试的数据。