Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python字典被转换为字符串_Python_Python 3.x_Dictionary_Flask - Fatal编程技术网

Python字典被转换为字符串

Python字典被转换为字符串,python,python-3.x,dictionary,flask,Python,Python 3.x,Dictionary,Flask,我编写了一个Web服务器,在使用bulkdelete函数删除任务时遇到问题 在delete函数中,tasks是一个OrderedDicts列表。但是,在bulkdelete函数中,返回的是类型string,而不是OrderedDict,我不理解这一点。内容是否在某处转换,我如何在bulkdelete函数中访问任务[count][“id”]?现在它回来了 TypeError: string indices must be integers, not str 在这里您可以看到我的全部代码: fro

我编写了一个Web服务器,在使用bulkdelete函数删除任务时遇到问题

在delete函数中,tasks是一个OrderedDicts列表。但是,在bulkdelete函数中,返回的是类型string,而不是OrderedDict,我不理解这一点。内容是否在某处转换,我如何在bulkdelete函数中访问任务[count][“id”]?现在它回来了

TypeError: string indices must be integers, not str
在这里您可以看到我的全部代码:

from flask import Flask, request, Response
import json
app = Flask(__name__)
from collections import OrderedDict
tasks=[]

# Create a new task
@app.route('/v1/tasks', methods=['POST'])
def post():
    data = request.get_json()
    if "title" not in data:
        return bulkadd(data)
    completed=False
    if "is_completed" in data:
        completed=data["is_completed"]
    title = data["title"]
    tasks.append(OrderedDict((
        ('id', len(tasks) + 1),
        ('title', title),
        ('is_completed', completed),
    )))
    index = len(tasks)
    return json.dumps({"id": index}), 201


#List all tasks created
@app.route('/v1/tasks', methods=['GET'])
def getall():
   print(json.dumps({"tasks": tasks}))
   return json.dumps({"tasks": tasks}), 200

#Get a specific task
@app.route('/v1/tasks/<id>', methods=['GET'])
def getone(id):
    #This is wrong if one id is deleted and afterwards another one get
    i=0
    while i < len(tasks):
        if tasks[i]["id"]==int(id):
            return tasks[i], 200
        i=i+1
    return json.dumps({"error": "There is no task at that id"}), 404

#Delete a specific task
@app.route('/v1/tasks/<id>', methods=['DELETE'])
def delete(id):
    #loop that iterates through the list, searches for "id" in each dict and if they match, the dict is deleted
    i=0
    print(type(tasks))
    print(type(tasks[i]))
    while i < len(tasks):
        if tasks[i]["id"]==int(id):
            del tasks[i-1]
    return Response(status=204)

#(Extra Credit) Bulk delete tasks
@app.route('/v1/tasks/', methods=['DELETE'])
def bulkdelete():
    data=request.get_json()
    ids=data["tasks"]
    cleaned_ids=[]
    i = 0
    #print(tasks)
    while i < len(ids):
        cleaned_ids.append(ids[i]["id"])
        i=i+1
    print(cleaned_ids)
    for id in cleaned_ids:
        count=0
        while count < len(tasks):
            print(tasks[count])
            print(type(tasks[count]))
            if tasks[count]["id"] == id:
                print("delete")
                del tasks[count]
            count=count+1
    print(tasks)
    return Response(status=204)

#Edit the title or completion of a specific task
@app.route('/v1/tasks/<int:id>', methods=['PUT'])
def edit(id):
    data=request.get_json()
    i=0
    while i < len(tasks):
        if tasks[i]["id"] == id:
            tasks[i]["title"]=data["title"]
            tasks[i]["is_completed"]=data["is_completed"]
            return Response(status=204)
        i=i+1
    return json.dumps({"error": "There is no task at that id"}), 404

#(Extra Credit) Bulk add tasks
def bulkadd(data):
    content=data["tasks"]
    output=[]
    i=0
    while i < len(content):
        tasks.append(json.dumps({"id": len(tasks)+1, "title": content[i].get("title"), "is_completed": content[i].get("is_completed")}))
        output.append({"id": len(tasks)})
        i=i+1
    return json.dumps({"tasks": output}), 201

谢谢你的帮助

在研究您的问题之前,我对您的代码有几点意见。我会将任务存储在字典中,以便以后更容易删除,而不是像现在这样将dict存储在列表中

任务如下所示:

tasks = {1: {'title': 'test', 'is_completed': False}, 2 : {'title': 'test2', 'is_completed': True}
data=request.get_json()
for task in data['tasks']:
    del tasks[task['id']]
return Response(status=204)
批量删除的改进方法如下所示:

tasks = {1: {'title': 'test', 'is_completed': False}, 2 : {'title': 'test2', 'is_completed': True}
data=request.get_json()
for task in data['tasks']:
    del tasks[task['id']]
return Response(status=204)
使用所有while循环和计数器并不是真正的pythonic,这会导致代码较长,容易出错


我希望您能够按照我的示例改进代码的其他部分,如果您需要进一步的帮助,请随时更新我们

在研究您的问题之前,我对您的代码有几点意见。我会将任务存储在字典中,以便以后更容易删除,而不是像现在这样将dict存储在列表中

任务如下所示:

tasks = {1: {'title': 'test', 'is_completed': False}, 2 : {'title': 'test2', 'is_completed': True}
data=request.get_json()
for task in data['tasks']:
    del tasks[task['id']]
return Response(status=204)
批量删除的改进方法如下所示:

tasks = {1: {'title': 'test', 'is_completed': False}, 2 : {'title': 'test2', 'is_completed': True}
data=request.get_json()
for task in data['tasks']:
    del tasks[task['id']]
return Response(status=204)
使用所有while循环和计数器并不是真正的pythonic,这会导致代码较长,容易出错


我希望您能够按照我的示例改进代码的其他部分,如果您需要进一步的帮助,请随时更新我们

问题在于,您的任务[i]是一个字典,但采用字符串格式。 通过调试您的代码,我在出错时得到了第一行: (第二行是您希望tasks[i]成为的内容,请注意,第一行是字符串而不是dict)

问题出在bulkadd函数中,也可能出在您拥有的其他add函数中。当您使用jsom.dumps({“key”:“val”})时,它将创建一个字符串格式的dict,如:“{”key:“val”}”

我相信问题出在bulkadd函数(和其他add函数)中,当您在添加到任务列表时使用json.dumps。因此,如果在追加时删除main.dumps,应该可以解决问题,但可以保留返回的json.dumps()作为flask应用程序的响应。通过执行该任务,[I]将成为dict,而不是字符串格式的dict

def bulkadd(data):
    content=data["tasks"]
    output=[]
    i=0
    while i < len(content):
        tasks.append(json.dumps({"id": len(tasks)+1, "title": content[i].get("title"), "is_completed": content[i].get("is_completed")}))
        output.append({"id": len(tasks)})
        i=i+1
    return json.dumps({"tasks": output}), 201
def bulkadd(数据):
内容=数据[“任务”]
输出=[]
i=0
而我
def bulkadd(数据):
内容=数据[“任务”]
输出=[]
i=0
而我
问题在于,您的任务[i]是一本字典,但采用字符串格式。 通过调试您的代码,我在出错时得到了第一行: (第二行是您希望tasks[i]成为的内容,请注意,第一行是字符串而不是dict)

问题出在bulkadd函数中,也可能出在您拥有的其他add函数中。当您使用jsom.dumps({“key”:“val”})时,它将创建一个字符串格式的dict,如:“{”key:“val”}”

我相信问题出在bulkadd函数(和其他add函数)中,当您在添加到任务列表时使用json.dumps。因此,如果在追加时删除main.dumps,应该可以解决问题,但可以保留返回的json.dumps()作为flask应用程序的响应。通过执行该任务,[I]将成为dict,而不是字符串格式的dict

def bulkadd(data):
    content=data["tasks"]
    output=[]
    i=0
    while i < len(content):
        tasks.append(json.dumps({"id": len(tasks)+1, "title": content[i].get("title"), "is_completed": content[i].get("is_completed")}))
        output.append({"id": len(tasks)})
        i=i+1
    return json.dumps({"tasks": output}), 201
def bulkadd(数据):
内容=数据[“任务”]
输出=[]
i=0
而我
def bulkadd(数据):
内容=数据[“任务”]
输出=[]
i=0
而我
您正在传递一个字符串作为索引。但是在delete函数中,这也起作用:if tasks[i][“id”]==int(id)。因此,我不明白为什么它不应该在bulkdelete@ErrolYou中工作。你正在将字符串作为索引传递。但是在delete函数中,这也起作用:if tasks[I][“id”]==int(id)。所以我不明白为什么它不应该在bulkdelete@Errol中工作