关于载入本地模块的几点疑问

代码

import calculator #报错
import game
import random1
from sys import exit
def tool():
    ans=1
    a='按0离开程序;\n按1玩石头剪刀布;\n按2运行随机数生成;\n按3运行四则运算计算器。'
    print('欢迎来到全能工具箱')
    while ans==1 or 2 or 3:
        ans=int(input(a+'\n请输入指定数字:'))
        if ans==1:
            game.play()
        elif ans==2:
            random1.randomno()
        elif ans==3:
            calculator.cal()#报错
        elif ans==0:
            exit()
tool()#报错

本地模块

import tools#报错
def cal():
    print('计算器')
    ask=1
    while ask==1:
        no1=int(input('输入第一个数:'))
        symbol=str(input('输入运算符号:'))
        no2=int(input('请输入第二个数:'))
        if symbol=='+':
            ans=no1+no2
            print(ans)
        elif symbol=='-':
            ans=no1-no2
            print(ans)
        elif symbol=='*':
            ans=no1*no2
            print(ans)
        elif symbol=='/':
            ans=no1/no2
            print(ans)
        else:
            print('error')
        ask=int(input('按1继续;按0结束程序,请输入:'))
        if ask==0:
            tools.tool()

报错

报错截图

报错

报错文字

Traceback (most recent call last):
File “C:\Users\abc\Documents\Python\tools\tools(2.0)\tools.py”, line 1, in
import calculator
File “C:\Users\abc\Documents\Python\tools\tools(2.0)\calculator.py”, line 1, in
import tools
File “C:\Users\abc\Documents\Python\tools\tools(2.0)\tools.py”, line 19, in
tool()
File “C:\Users\abc\Documents\Python\tools\tools(2.0)\tools.py”, line 16, in tool
calculator.cal()
AttributeError: partially initialized module ‘calculator’ has no attribute ‘cal’ (most likely due to a circular import)

疑问

我想问下如何解决、为什么会报错。
我一开始以为是跟其他模块冲突,但是我改了名,还是会报错。 我其他的模块都不会报错。

Jason990420
最佳答案

原因应该是 tools.py 导入 calculator.py, calculator.py 又导入 tools.py. (circular import), 把 calculator.py 的第一行 import tools 移除就好了.

另外, calculator.py 又调用 tools.tool(), 这问题是程序设计的问题, 如果你真的这么作, 就会变成重复的循环调用. (A call B and B call A).

设计的方式应该是

# in calculator.py
        if ask==0:
            return
3年前 评论
讨论数量: 1
Jason990420

原因应该是 tools.py 导入 calculator.py, calculator.py 又导入 tools.py. (circular import), 把 calculator.py 的第一行 import tools 移除就好了.

另外, calculator.py 又调用 tools.tool(), 这问题是程序设计的问题, 如果你真的这么作, 就会变成重复的循环调用. (A call B and B call A).

设计的方式应该是

# in calculator.py
        if ask==0:
            return
3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!