5

我正在尝试使用 voluptuous 来验证来自 HTTP 请求的 JSON 输入。但是,它似乎不能很好地处理 unicode 字符串。

from voluptuous import Schema, Required
from pprint import pprint

schema = Schema({
    Required('name'): str,
    Required('www'): str,
})

data = {
    'name': 'Foo',
    'www': u'http://www.foo.com',
}

pprint(data)
schema(data)

上面的代码会产生以下错误:

 voluptuous.MultipleInvalid: expected str for dictionary value @ data['www']

但是,如果我u从 URL 中删除符号,一切正常。这是一个错误还是我做错了?

附言。如果它与它有任何关系,我正在使用 python 2.7。

4

1 回答 1

6

Python 2.7 中有两种字符串类型:strunicode. 在 Python 2.7 中,str类型不是 Unicode 字符串,而是字节字符串。

因此,该值u'http://www.foo.com'确实不是类型的实例,str并且您遇到了该错误。如果您希望str在 Python 2.7 中同时支持 Unicode 字符串,您需要将架构更改为:

from voluptuous import Any, Schema, Required

schema = Schema({
    Required('name'): Any(str, unicode),
    Required('www'): Any(str, unicode),
})

或者,为简单起见,如果您总是收到 Unicode 字符串,那么您可以使用:

schema = Schema({
    Required('name'): unicode,
    Required('www'): unicode,
})
于 2015-07-09T11:29:16.633 回答