You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

技术求助:排查AttributeError: module 'MyLib' has no attribute 'add'异常

解决AttributeError: module 'MyLib' has no attribute 'add'问题

我一眼就揪出了问题的核心,还有几个小细节错误,咱们一步步来搞定:

主要问题:函数作用域错误

你的addsubmultdiv这些函数全都定义在MyLib.pymain()函数内部!在Python里,这种嵌套在函数里的内部函数属于局部作用域,只有外层的main()函数能调用它们,外部模块(也就是你的主程序)import MyLib后,根本看不到这些函数,自然会抛出AttributeError

其他需要修正的细节

  • 拼写错误:MyLib里定义的乘法函数是muilt,但主程序和scalc函数里都用的是mult,这会导致NameError,得把函数名改成mult
  • scalc函数的bug
    • 函数最后写了return value,但value变量根本没定义,得计算出对应运算的结果后返回;
    • 调用内部运算函数时,要确保这些函数已经是模块级别的(修正作用域后就没问题了)。
  • 大小写错误:主程序里调用Mylib.scalc(prob1),注意你import的是MyLib(首字母大写),这里写成了小写的Mylib,会引发NameError
  • 模块自动执行代码:MyLib.py最后几行的p1 = input(...)scalc(p1),当你import这个模块时会自动执行,会干扰主程序的流程,应该用if __name__ == "__main__":包裹,只有直接运行MyLib.py时才执行这段代码。

修正后的MyLib.py代码

# 把运算函数移到模块级别,外部可以直接访问
def add(num1, num2):
    sum_result = num1 + num2
    return sum_result

def sub(num1, num2):
    diff = num1 - num2
    return diff

def mult(num1, num2):
    prod = num1 * num2
    return prod

def div(num1, num2):
    if num2 == 0:
        return "You cannot divide by 0"
    else:
        quot = num1 / num2
        return quot

def scalc(p1):
    astring = p1.split(",")
    num1 = float(astring[0])
    num2 = float(astring[1])
    operator = astring[2].strip()  # 去掉可能的空格,增强鲁棒性
    value = None
    if operator == "+":
        value = add(num1, num2)
    elif operator == "-":
        value = sub(num1, num2)
    elif operator == "*":
        value = mult(num1, num2)
    elif operator == "/":
        if num2 == 0:
            value = "You cannot divide by 0"
        else:
            value = div(num1, num2)
    return value

# 原来的main函数可以保留,但如果不需要单独运行MyLib的话也可以删掉
def main():
    def float_input(msg):
        while True:
            try:
                return float(input(msg))
            except ValueError:
                print("You must enter a valid number.")

    lowrange = float_input("What is your low range?")
    highrange = float_input("What is your high range?")
    num1 = float_input("What is your first number?")
    num2 = float_input("What is your second number?")

    if num1 < lowrange or num1 > highrange or num2 < lowrange or num2 > highrange:
        print("The input values are outside ranges, please check the numbers and try again!")
    else:
        print("The result of", num1, "+", num2, "=", add(num1, num2))
        print("The result of", num1, "-", num2, "=", sub(num1, num2))
        print("The result of", num1, "*", num2, "=", mult(num1, num2))
        print("The result of", num1, "/", num2, "=", div(num1, num2))
    print("Thanks for using my calculator")

# 只有直接运行MyLib.py时才执行main和测试代码
if __name__ == "__main__":
    main()
    p1 = input("Enter two numbers and an operator separated by a comma: ")
    result = scalc(p1)
    print("The answer is:", result)

主程序的小修正

把这一行:

print("The answer to your problem is ", Mylib.scalc(prob1))

改成:

print("The answer to your problem is ", MyLib.scalc(prob1))

这样修改后,你的主程序就能正常调用MyLib里的所有函数啦,再也不会出现AttributeError了!

内容的提问来源于stack exchange,提问作者chrismove

火山引擎 最新活动