技术求助:排查AttributeError: module 'MyLib' has no attribute 'add'异常
解决AttributeError: module 'MyLib' has no attribute 'add'问题
我一眼就揪出了问题的核心,还有几个小细节错误,咱们一步步来搞定:
主要问题:函数作用域错误
你的add、sub、mult、div这些函数全都定义在MyLib.py的main()函数内部!在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




