即使类型正确,Flask NoneType错误也会随机出现,有时,它会随机工作



#这是我的类:

class CryptoClass:
def __init__(self, cfrom, cto):
self.cfrom = cfrom
self.cto   = cto

def priceConverter(self):
dic = cryptocompare.get_price([self.cfrom],[self.cto])
return [self.cfrom,self.cto,dic[self.cfrom][self.cto]]

#以下是功能:

def converter():

A = str(request.form.get("FROM"))
B = str(request.form.get("TO"))

if A!="" and B!="":
price1 = CryptoClass(A,B)
a = price1.priceConverter()


return render_template("converter.html", fromResult =  a[0],toResult = a[2],toResultName = a[1])

#最后,这里是我得到的错误:

return [self.cfrom,self.cto,dic[self.cfrom][self.cto]]
TypeError: 'NoneType' object is not subscriptable

我对我的问题感到奇怪的是,有时它有效,有时无效,但我找不到它背后的逻辑,任何帮助都将不胜感激:(

p.S:如果我用A代替A和B="A";BTC";并且B=";ETH";,它的工作原理很有魅力,我确保请求确实有效,并尝试使用表单中的值打印a和B,但当我把所有代码放在一起时,我甚至无法访问表单页面,因为我会弹出这个错误。

您的问题可能是由两件事引起的:

  1. 无效值(FROMTO(
  2. cryptocompare.get_price响应

让我们从1开始。在您的请求处理中,有三种可能的情况,两个值都被提供了,并且都是有效的加密货币(比如FROM=ETHTO=BTC(,

只提供了一个值有效加密货币让我们来处理最后两个,因为第一个已经包含在源代码中了。

未提供的值:在调用request.form.get()时,请确保建议一个默认值,或者注意,如果请求的值不存在,此函数返回None(不是空字符串(。此外,这样改进你的代码会很好:

A = request.form.get("FROM", "")
B = request.form.get("TO", "")

无效的加密货币:在这一点上,我做了一些假设(基于对min-API.cryptocompare.com的Web API调用和源代码。当您使用无效参数调用cryptocompare.get_price时,比如cryptocompare.get_price(['BTC'], ['AAAAAAAAA']),它会返回None对象。

考虑到这一点,dic的值将是None,当您尝试运行此dic[self.cfrom][self.cto]时,您将尝试为None对象添加下标。因此,错误为:TypeError: 'NoneType' object is not subscriptable

建议在返回语句之前检查dic对象:

dic = cryptocompare.get_price([self.cfrom],[self.cto])
if dic:
return [self.cfrom,self.cto,dic[self.cfrom][self.cto]]
return [self.cfrom,self.cto,None]

请注意,如果dicNone,那么return语句中列表的最后一部分也是None,并且需要在接收此响应的代码部分中进行相应处理。

祝你好运!

最新更新