性感无法处理unicode字符串?

lan*_*ng2 5 python string unicode python-2.7 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)
Run Code Online (Sandbox Code Playgroud)

上面的代码生成以下错误:

 voluptuous.MultipleInvalid: expected str for dictionary value @ data['www']
Run Code Online (Sandbox Code Playgroud)

但是,如果我u从URL中删除表示法,一切正常.这是一个错误还是我做错了?

PS.我正在使用python 2.7,如果它与它有任何关系.

Sim*_*ser 6

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

所以这个值u'http://www.foo.com'确实不是一个类型的实例str而且你得到了那个错误.如果您希望str在Python 2.7中同时支持Unicode和Unicode字符串,则需要将架构更改为:

from voluptuous import Any, Schema, Required

schema = Schema({
    Required('name'): Any(str, unicode),
    Required('www'): Any(str, unicode),
})
Run Code Online (Sandbox Code Playgroud)

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

schema = Schema({
    Required('name'): unicode,
    Required('www'): unicode,
})
Run Code Online (Sandbox Code Playgroud)