【问题标题】:Unabe to return my value after the api call - getting TypeError: 'dict' object is not callable [duplicate]api调用后无法返回我的值-获取TypeError:'dict'对象不可调用[重复]
【发布时间】:2020-03-25 04:19:05
【问题描述】:

我正在尝试从 api 获取值并使用 api 调用返回它。当我尝试调用 api 函数时,我面临 TypeError: 'dict' object is not callable。我的代码如下

import json
import requests
import datetime
import sys

from flask import Flask, request, jsonify


app = Flask(__name__)
port = '5000'

data = {
      "d": {
        "results": [{
          "timeAccount": "031799ce7bc344a2bb65e7f05cb08c49",
          "balance": "10.1388824",
          "timeAccountType": "SA_AL_DLY",
          "userId": "01000",
          "accountClosed": "false",
          "timeUnit": "DAYS"
        }, {
          "timeAccount": "bc4fb4d44c3e413d8137a59d121c74b6",
          "balance": "25.347206",
          "timeAccountType": "SA_AL_DLY",
          "userId": "01000",
          "accountClosed": "false",
          "timeUnit": "DAYS"
        }, {
          "timeAccount": "f12279ea0d34471581aff90ad71d3f83",
          "balance": "5.6249964",
          "timeAccountType": "SA_AL_DLY",
          "userId": "01000",
          "accountClosed": "false",
          "timeUnit": "DAYS"
        }]
      }
    }


@app.route('/leave_balance')
def leave_balance():
    Balance = 0.0
    for res in data['d']["results"]:
        Balance = Balance + float(res("balance"))

    return jsonify(  
        {
        "conversation": {
            "memory": {
              "balance1" : Balance
             }
         }
        })


if __name__ == '__main__':
    app.run(port=port)

我使用另一个 api 获取的 json 数据,我已将其作为数据添加到代码中。当我作为正常程序单独执行休假余额功能时,它可以正常执行。但是当我作为 API 调用时,我遇到了这个错误

Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
[2020-03-25 09:32:02,490] ERROR in app: Exception on /leave_balance [GET] 
Traceback (most recent call last):
  File "C:\Users\Dell\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\Dell\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\Dell\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\Dell\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "C:\Users\Dell\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\Dell\AppData\Local\Programs\Python\Python37\lib\site-packages\flask\app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "c:\Users\Dell\Desktop\CAI-SF\datetime.py", line 101, in leave_balance
    Balance = Balance + float(res("balance"))
TypeError: 'dict' object is not callable
127.0.0.1 - - [25/Mar/2020 09:32:02] "GET /leave_balance HTTP/1.1" 500 -

请帮帮我

【问题讨论】:

  • res 是一个字典,你应该使用方括号语法来访问它的键 - Balance = Balance + float(res["balance"])

标签: python json api object flask


【解决方案1】:

正如@Iain Shelvington 评论中提到的,你必须在 python 字典中使用方括号,但这很容易出错,另一种方法是使用 .get() 方法,如果这样的键不存在,则不会引发 KeyError .

例如,你的代码我会改成这样:

import json
import requests
import datetime
import sys

from flask import Flask, request, jsonify


app = Flask(__name__)
port = '5003'

data = {
      "d": {
        "results": [{
          "timeAccount": "031799ce7bc344a2bb65e7f05cb08c49",
          "balance": "10.1388824",
          "timeAccountType": "SA_AL_DLY",
          "userId": "01000",
          "accountClosed": "false",
          "timeUnit": "DAYS"
        }, {
          "timeAccount": "bc4fb4d44c3e413d8137a59d121c74b6",
          "balance": "25.347206",
          "timeAccountType": "SA_AL_DLY",
          "userId": "01000",
          "accountClosed": "false",
          "timeUnit": "DAYS"
        }, {
          "timeAccount": "f12279ea0d34471581aff90ad71d3f83",
          "balance": "5.6249964",
          "timeAccountType": "SA_AL_DLY",
          "userId": "01000",
          "accountClosed": "false",
          "timeUnit": "DAYS"
        }]
      }
    }


@app.route('/leave_balance')
def leave_balance():
    Balance = 0.0
    for res in data['d']["results"]:
        b = res.get('balance', 0.0)
        Balance += float(b)

    return jsonify(  
        {
        "conversation": {
            "memory": {
              "balance1" : Balance
             }
         }
        })


if __name__ == '__main__':
    app.run(port=port)

注意我的变化:

Balance = Balance + float(res("balance"))

收件人:

b = res.get('balance', 0.0)
Balance += float(b)

所以在我的示例中发生的情况是,首先,我尝试像 b = res.get('balance', 0.0) 那样从您的字典中找到“余额”get,如果它不存在,那么我分配一个 0.0并且不会给出KeyError

然后我将b 的任何内容转换为float 并使用+=Balance 添加新余额,从而生成UI:

【讨论】:

    猜你喜欢
    • 2019-08-10
    • 2011-10-01
    • 2012-10-31
    • 1970-01-01
    • 2019-02-27
    • 2017-05-27
    • 2016-03-07
    • 1970-01-01
    相关资源
    最近更新 更多