我正在访问基于Web的API,并使用以下代码作为我的最低抽象级别(使用调试打印)。
以下奇怪的行为只发生在某些api调用上,即返回的唯一内容是单个字典对象。我想更多地了解这种行为,以及如何解决它。
问题是python正在将.json()返回的字典对象转换为
上的列表ret += res.json()
线。
但是,代码适用于返回字典列表,混合类型列表等的API调用。
import requests, json, re
def api_get(s):
username = "username"
password = ""
url = 'base_url' + s
ret = []
while url != None:
res = requests.get(url, auth=(username, password))
print ret
print res.json()
ret += res.json()
print ret
try:
url = re.search('<(.+?)>; rel="next"', res.headers['link']).group(1)
except (AttributeError, KeyError) as e:
url = None
return ret
这是输出:
[]
{u'activities':[{u'body':u'stuff',u'created_at': u'2014-07-29T05:31:14Z',你''':无,你的主题':无}],你''': [],u'emails':[]}
[u'activities',u'notes',u'emails']
如您所见,res.json()打印的值和ret + = res.json()之后的ret是不一致的。
答案 0 :(得分:1)
我认为您打算使用.append()
代替+=
。让我们看一个例子:
ret = [1, 2, 3]
ret += {'value': 4}
print ret
打印:
[1, 2, 3, 'value']
这正是你所观察到的。当您使用+=
时,它只会附加json(字典&#39; s)键。
如果您使用过这样的.append()
:
ret = [1, 2, 3]
ret.append({'value': 4})
print ret
你会得到:
[1, 2, 3, {'value': 4}]
答案 1 :(得分:1)
当您运行mylist += something
之类的代码时,Python会尝试迭代something
。这相当于运行:
for i in something:
mylist.append(i)
当你遍历字典时,你会得到一个字符列表。
>>> for i in {"a": 1, "b": 2}: print i
a
b
这就是为什么你看到字典的键被添加到列表中的原因。如果您只是想在没有所有这些喧哗的情况下将字典添加到列表中,您可以使用.append()
,如下所示:
>>> a = []
>>> a.append({"a": 1, "b": 2})
>>> print a
[{'a': 1, 'b': 2}]
答案 2 :(得分:0)
不,它正在做正确的事。当你迭代一个字典时,你得到它的键。 list += iterable
迭代右侧并将其添加到列表中。因为右侧是一个字典,所以它的键被添加到列表中。
答案 3 :(得分:0)
不仅仅是
alist = []
adict = {'one': 1, 'two', 2, 'three', 3}
alist += adict
alist += adict
相当于alist.extend(iter(adict))
iter(adict)
会返回adict
因此,您所描述的行为是预期的。