gpt4 book ai didi

python - Flask 将命名元组作为字典返回,但并非始终如此

转载 作者:太空宇宙 更新时间:2023-11-03 10:52:46 24 4
gpt4 key购买 nike

我有一个非常小的 Flask 应用程序,看起来非常像这样:

Point = namedtuple('Point', ['lat', 'lng', 'alt'])

p1 = Point(38.897741, -77.036450, 20)


def create_app():
app = flask.Flask(__name__)

@app.route('/position')
def position():
return flask.jsonify({
'vehicle': p1,
})

return app

它的存在只是为了将位置数据提供给网络用户界面。我原以为 Point namedtuple 会呈现为 JSON 数组,但令我惊讶的是我得到了:

{
"vehicle": {
"alt": 20,
"lat": 38.897741,
"lng": -77.03645
}
}

...这,你知道,这很好。我可以用那个工作。但后来我写了一些单元测试,看起来像这样:

from unittest import TestCase
import json
import tupletest

class TupleTestTest(TestCase):
def setUp(self):
_app = tupletest.create_app()
_app.config['TESTING'] = True
self.app = _app.test_client()

def test_position(self):
rv = self.app.get('/position')
assert rv.status_code == 200
assert rv.mimetype == 'application/json'
data = json.loads(rv.get_data())
assert data['vehicle']['lat'] = 38.897741

...他们失败了,因为突然间我没有得到字典:

>       assert data['vehicle']['lat'] == 38.897741
E TypeError: list indices must be integers, not str

事实上,如果在测试中我将返回值写到我拥有的文件中:

{
"vehicle": [
38.897741,
-77.03645,
20
]
}

什么。

这是怎么回事?出于这个问题的目的,我什至无法复制它;上面的单元测试呈现字典。就像我的实际 webapp 一样,它在运行时,但在测试时却没有。但在另一个系统上,我似乎从实际应用程序中获取数组。

最佳答案

查看源码,在flask的jsonify.py中是这样的:

# Use the same json implementation as itsdangerous on which we
# depend anyways.
from itsdangerous import json as _json

ittangerous.py 中有:

try:
import simplejson as json
except ImportError:
import json

simplejson 库有一个默认启用的选项 namedtuple_as_object


因此,当安装第 3 方 simplejson 时,应用程序会使用它并将 namedtuple 序列化为 JSON 对象(Python 中的字典)。

在未安装该库的系统上,应用程序回退到标准 json 并将命名元组序列化为数组(列表)。

但是如果 simplejson 被 flask 安装和导入,测试程序直接导入标准的 json 覆盖它,从而改变运行和测试之间的行为。

关于python - Flask 将命名元组作为字典返回,但并非始终如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47106862/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com