-2

我通过一些黑盒函数在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 中,我会简单地收集键值对并将它们存储到关联数组中。

4

2 回答 2

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' }
于 2013-03-08T00:48:20.547 回答
2

根据您对另一个答案的评论,我打赌oDatanamedtuples 的列表,并且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

这可以解释为什么你不能修改它。元组,命名或任何其他类型,都是不可变的。

我能想到的将其转换为 a 的最简单方法dict是使用vars

>>> dict(vars(x))
{'A': 1, 'C': 3, 'B': 2}

由于someFunction返回一个可迭代对象,因此您需要遍历每个元素以将所有行转换为dicts:

oDataDicts = [dict(vars(r)) for r in oData]

如果您期望 1,您可以尝试提取第一个元素,但这意味着更多代码处理没有 1 的情况。

通常,调用vars返回 a dict,但对于namedtuple,它似乎返回 a OrderedDict。如果OrderedDict不打扰您,您可以停止对 的额外调用dict

此外,我强烈建议您更明确地说明要包含在响应中的输出。依赖HttpResponse的行为可能会使以后更难记住代码应该做什么。如果您想发送 JSON 响应,将其显式转换为 JSON 将是一个好主意。

于 2013-03-08T01:30:50.780 回答