总结:
没有使用 params 参数的内置选项,并且将 bool 值从 python True|False 转换为 json true|false。
我们必须手动处理布尔值以将它们转换为小写字符串。下面介绍几种处理方法。
例如:
对各个值进行编码
'true' if x else 'false' 或 json.dumps(x)
为什么
requests.request 的内部方法使用字符串化来转换任何非字符串值。请参阅PreparedRequest 中的prepare_url。
如果同时使用查询和参数,则 enc_params 由'%s&%s' % (query, enc_params) 转换为字符串。如果不是,那么query=enc_params 是在requote_url 内编码的字符串。
### excerpt from PreparedRequest.prepare_url
enc_params = self._encode_params(params)
if enc_params:
if query:
query = '%s&%s' % (query, enc_params)
else:
query = enc_params
url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment]))
self.url = url
str(True) # 'True'
str(False) # 'False'
'%s' % True # 'True
import json
json_dumps(None) # 'null' <-- probably want to avoid null for Boolean values
json.dumps(True) # 'true' <-- lowercase
json.dumps(False) # 'false' <-- lowercase
如何
对于一两个值,您可以使用简单的三元,但这很快就会变得冗长。
is_coming_soon, is_paid = False, True
params = {'is_coming_soon': 'true' if is_coming_soon else 'false',
'is_paid': 'true' if is_paid else 'false',
'limit': 100, 'skip': 0}
或者也许是一个快速的功能来为你做这件事:
encode_bool = lambda x: 'true' if x else 'false'
is_coming_soon, is_paid = False, True
params = {'is_coming_soon': encode_bool(is_coming_soon),
'is_paid': encode_bool(is_paid),
'limit': 100, 'skip': 0}
或者我们可以向上移动堆栈并创建一个函数来修改所有布尔值
# Caveat: this only encodes one level of structure.
def encode_boolean_values(kv):
""" convert bool values to 'true'/'false' strings for json compat """
enc = lambda x : x if not isinstance(x, bool) else 'true' if x else 'false'
{k: enc(v) for k,v in kv.items()}
is_coming_soon, is_paid = False, True
params = {'is_coming_soon': is_coming_soon,
'is_paid': is_paid,
'limit': 100, 'skip': 0}
params = encode_boolean_values(params)
注意:您可以使用 json.dumps() 代替三元。我使用三元将 Null 折叠为 False 而不是将其设为“null”