我通过一些黑盒函数在python中得到一个对象 oData (被归类为可迭代对象):
oData = someFunction()
当我这样做时:
HttpResponse( oData )
我明白了:
{'A':0.0, 'B':1.0, 'C':1.0 }
我无法做到
HttpResponse( type(oData) )
我刚收到500服务器错误。为什么这不只是一个字符串?如何输出我需要的信息?无论如何,这是次要的。
最终我想要做的是将oData作为字典对象,所以我可以像这样添加一个元素:
{ 'A':0.0, 'B':1.0, 'C':1.0, 'New':'myValue' }
我该怎么做?
-----编辑:只是为了澄清一些事情......(并且还省略了上面的一些无关信息)
oData确实是一个不可变对象,带有__iter__()
方法的定义。
我寻求的答案可能涉及以某种方式克隆其数据,以便我可以追加它。
我试过这个没有运气
oCopy = ( i for i in oData )
在PHP中,我只是收集键值对并将它们存储到关联数组中。
答案 0 :(得分:2)
当你打电话给type(oData)
时,你会得到一个type
对象,这是不可迭代的(这甚至意味着什么?)。
您需要该对象的字符串表示形式。请使用str
:
HttpResponse( str(type(oData)) )
将为您提供该类型的名称,并
oData['New'] = 'myValue'
HttpResponse( str(oData) )
将返回类似
的内容{ 'A':0.0, 'B':1.0, 'C':1.0, 'New':'myValue' }
答案 1 :(得分:2)
根据您对其他答案的评论,我打赌oData
是namedtuple
的列表,HttpResponse
正在做某种魔术将其转换为您的结果看到。观察此演示,它会提出您提到的相同错误:
>>> from collections import namedtuple
>>> X = namedtuple('X', ['A', 'B', 'C'])
>>> x = X(1,2,3)
>>> dict([x])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 3; 2 is required
这可以解释为什么你不能修改它。命名或任何其他类型的元组是不可变的。
我能想到的将其转换为dict
的最简单方法是使用vars
>>> dict(vars(x))
{'A': 1, 'C': 3, 'B': 2}
由于someFunction
返回一个iterable,您需要迭代每个元素以将所有行转换为dict
s:
oDataDicts = [dict(vars(r)) for r in oData]
如果您期望1,您可以尝试提取第一个元素,但这意味着当不存在1时,会处理更多代码。
通常,调用vars
会返回dict
,但对于namedtuple
,它似乎会返回OrderedDict
。如果OrderedDict
没有打扰您,您可以不再拨打dict
。
此外,我强烈建议您对要包含在响应中的输出更加明确。依赖HttpResponse
的行为可能会让人更难记住代码应该在以后做什么。如果您想发送JSON响应,显式将其转换为JSON将是一个好主意。