【问题标题】:TypeError: string indices must be integers. Python, Flask [closed]TypeError:字符串索引必须是整数。 Python,烧瓶[关闭]
【发布时间】:2021-05-04 21:56:11
【问题描述】:

我有一个通过 Flask 中的会话创建的简单购物车:

session['cart'] += [{
    'product_name': request.form['product_name'],
    'product_cost': request.form['product_cost'],
    'product_img': request.form['product_img'],
}]

购物车示例:

product_cart = [{'product_name': 'product1', 'product_cost': '300', 'product_img': ''},
                {'product_name': 'product2', 'product_cost': '400', 'product_img': ''},
                {'product_name': 'product3', 'product_cost': '300', 'product_img': ''},
               ]

在哪里product_cart = session['cart']

我需要得到product_cost 值的总和。我试图这样做:

sum([int(product['product_cost']) for product in product_cart ])

但是出现了这个错误:TypeError: string indices must be integers。正如我未测试的那样,product_cost 应该是 int 类型,而不是 dict 中的 str。但是当我尝试获取它们的总和时,我已经将其转换为int(请参阅更高的代码)。

那么,我做错了什么,我该如何解决这个错误?谢谢!

编辑:

print(session['cart']:

[{'product_name': 'product1', 'product_cost': '300', 'product_img': '*binary img*'}, {'product_name': 'product2', 'product_cost': '400', 'product_img': '*binary img*'}]

完整追溯:

Traceback (most recent call last):
    File "C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\site-   packages\flask\app.py", line 2450, in wsgi_app
response = self.handle_exception(e)
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
  File "C:\Users\User\AppData\Local\Programs\Python\Python39\Lib\site-packages\flask\app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\User\Documents\Projects\jewelry-store\app.py", line 336, in cart
full_cost = sum([int(product['product_cost']) for product in cart_products ])
  File "C:\Users\User\Documents\Projects\jewelry-store\app.py", line 336, in <listcomp>
full_cost = sum([int(product['product_cost']) for product in cart_products ])
TypeError: string indices must be integers

【问题讨论】:

  • 您能否打印session['cart'] 的值并将其添加到您的问题文本中?
  • 根据你得到的错误,product是一个字符串,你应该先把它转换成dict
  • @dukkee 已编辑问题
  • 您的求和代码对于显示的两个购物车(您的示例和打印出来的那个)都非常有效。您的代码不同(可能cart_productsproduct_cart 不同?)或者在与所示示例不同的购物车上调用时发生错误。正如 Gabip 已经观察到的那样,不知何故,您购物车中的一个或多个项目是字符串而不是字典。
  • 请提供明确的minimal reproducible example。使用提供的product_cart 运行sum 行没有引发任何错误...

标签: python


【解决方案1】:

这里有些东西没有加起来(没有双关语):

full_cost = sum([int(product['product_cost']) for product in cart_products ])
TypeError: string indices must be integers

当您问题中的 product_cart 作为输入提供时,它应该可以工作。

但是,如果您有一个字符串作为 product_cart 列表的成员,而不是字典,则会抛出此异常:

>>> product_cart = ['test']
>>> sum([int(product['product_cost']) for product in product_cart ])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <listcomp>
TypeError: string indices must be integers

或者换一种说法:

>>> {'product_cost':'123'}['product_cost']
'123'
>>> 'some_string'['product_cost']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: string indices must be integers

因此,您在代码中看到的异常是因为 sum 函数中的列表理解正在获取 product 的字符串。

您的session['cart'] 中似乎有些问题,因此任何人都无法使用此问题中提供的信息来解决问题,抱歉。

【讨论】:

  • 是的,完全正确,我刚刚重新创建了会话,它可以工作。抱歉浪费了你的时间
  • @h4cktivist 不浪费,很高兴你能深入了解它,希望这个答案能帮助你理解原因。另外我建议使用float 而不是int,因为if 您的购物车中有一个成本字符串,其中包含一个小数,它会引发异常。例如...int('1.2') 给出ValueError: invalid literal for int() with base 10: '1.2'
猜你喜欢
  • 2014-02-15
  • 2016-03-26
  • 2016-02-17
  • 2023-03-03
  • 1970-01-01
  • 2022-11-02
  • 2019-04-26
  • 2020-08-04
  • 1970-01-01
相关资源
最近更新 更多