遇到两个特定值时的 TypeError

Posted

技术标签:

【中文标题】遇到两个特定值时的 TypeError【英文标题】:TypeError when two specific values are encountered 【发布时间】:2021-08-14 21:46:40 【问题描述】:

除 86 和 93 之外的所有数字都运行良好。只有 86 和 93 会抛出 TypeError。 但我想使用 86 和 93 来包含所有数字。我该怎么办?

from tkinter import *

app=Tk()
app.title("progress")
app.geometry("800x500+365+120")

q='weigh':100,'goal':75,'now':86 #or 'now':93

def bar():
    first=int(q['weigh'])
    achieve=int(q['goal'])
    today=int(q['now'])

    def num(n):
        for z in range(0,n):
            y=(first-achieve)*(z/100)
            if (first-today)==y:
                return z
            if today<achieve:
                z=100
                return z
    rate=int(num(101)/10)
    for _ in range(1,rate+1):
        Entry(app,bg="blue",width=4).pack(side=LEFT)
    for _ in range(rate,10):
        Entry(app,width=4).pack(side=LEFT)

Button(app,text="OK",command=bar).pack()
app.mainloop()

错误:

TypeError: unsupported operand type(s) for /: 'NoneType' and 'int'

【问题讨论】:

num() 返回了None,所以你可以调试它,找出问题所在 @OlvinR​​oght TypeError 发生在 rate=int(num(101)/10) 上。 【参考方案1】:

根据评论:num()返回None,所以你可以调试它,找出问题所在

您永远不会在num() 中输入两个 if 块之一。这意味着您永远无法到达return z。在 Python 中,如果没有明确的 return 语句,所有方法都会隐式返回 None。因此,您可能想要处理迭代 range(0,n) 并且从不输入 if 块之一的情况。在这种情况下,您应该返回一些东西或引发错误来处理这种情况。

编辑: 循环遍历整个范围时可能会引发错误。然后你会发现这是真正的问题。您永远不会输入 if 块之一。您可以捕获错误或添加一些有意义的返回值,例如 return 0 或您的代码中任何有意义的值。

def num(n):
    for z in range(0,n):
        y=(first-achieve)*(z/100)
        if (first-today)==y:
            return z
        if today<achieve:
            z=100
            return z
     raise ValueError

【讨论】:

TypeError 发生在 rate=int(num(101)/10) 上。 是的,看起来 num() 返回 None。

以上是关于遇到两个特定值时的 TypeError的主要内容,如果未能解决你的问题,请参考以下文章

Oracle/SQL:将日期和时间连接成单个日期值时的数字格式模型无效

通过 RegQueryValueEx 和 RegGetValue 获取注册表值时的奇怪行为 [重复]

使用 Ionic 从 Firebase 显示值时遇到问题

在汇编语言中确定返回值时遇到问题

过滤值时的Laravel条件子句

插入值时的 SCOPE_IDENTITY