【发布时间】:2016-02-17 20:33:58
【问题描述】:
我有以下 Python 代码
from flask import Flask, jsonify, json
app = Flask(__name__)
with open('C:/test.json', encoding="latin-1") as f:
dataset = json.loads(f.read())
@app.route('/api/PDL/<string:dataset_identifier>', methods=['GET'])
def get_task(dataset_identifier):
global dataset
dataset = [dataset for dataset in dataset if dataset['identifier'] == dataset_identifier]
if len(task) == 0:
abort(404)
return jsonify({'dataset': dataset})
if __name__ == '__main__':
app.run(debug=True)
Test.json 看起来像这样:
{
"dataset": [{
"bureauCode": [
"016:00"
],
"description": "XYZ",
"contactPoint": {
"fn": "AG",
"hasEmail": "mailto:AG@AG.com"
},
"distribution": [
{
"format": "XLS",
"mediaType": "application/vnd.ms-excel",
"downloadURL": "https://www.example.com/xyz.xls"
}
],
"programCode": [
"000:000"
],
"keyword": [ "return to work",
],
"modified": "2015-10-14",
"title": "September 2015",
"publisher": {
"name": "abc"
},
"identifier": US-XYZ-ABC-36,
"rights": null,
"temporal": null,
"describedBy": null,
"accessLevel": "public",
"spatial": null,
"license": "http://creativecommons.org/publicdomain/zero/1.0/",
"references": [
"http://www.example.com/example.html"
]
}
],
"conformsTo": "https://example.com"
}
当我像这样在 URL 中传递变量时:http://127.0.0.1:5000/api/PDL/1403
我收到以下错误:TypeError: string indices must be integers
知道“标识符”字段是一个字符串,并且我在 URL 中传递了以下内容:
http://127.0.0.1:5000/api/PDL/"US-XYZ-ABC-36"
http://127.0.0.1:5000/api/PDL/US-XYZ-ABC-36
我不断收到以下错误:
TypeError: string indices must be integers
知道我在这里缺少什么吗?我是 Python 新手!
【问题讨论】:
-
不要在列表理解中使用与迭代器和列表相同的变量名
-
OP 不仅在列表 comp 中使用了两次该名称,而且他还将结果分配给了相同的名称。
-
@DanielRoseman:在 Py2 中,这也会大大减慢速度,因为 list comps 共享范围(因此所有
dataset的使用都将共享全局,包括一遍又一遍地重新分配全局) ,让它变慢,而不仅仅是令人困惑。至少在 Py3 中,列表组合(如生成器表达式和 set/dict 组合)具有闭包范围,可以保护它们免受特定的低效率影响。 -
@RNar 你能澄清一下吗?
-
@ghadiehag:你把所有东西都命名为
dataset;这充其量是令人困惑的,并且在最坏的情况下可能导致不正确的行为,因为dataset尽管有这个名字,但指的是(在不同的点上)由json.loads产生的dict,来自上述@的键的list987654333@ 由列表推导生成,以及列表推导中迭代期间的键本身。