Python跨文件导入函数报错NameError: name 'checkAccF' is not defined
问题成因
该错误由**循环导入(循环依赖)**直接导致,触发过程如下:
- 执行run.py时,解释器首先运行
from CheckAcc import *语句,立刻暂停run.py的执行,开始加载CheckAcc.py文件 - CheckAcc.py开头执行
from run import username, password, id语句,又暂停CheckAcc.py的执行,回头加载run.py - 此时run.py还停留在导入CheckAcc的步骤,还未执行到
id、username、password三个变量的定义代码,更没有完成CheckAcc模块的加载,CheckAcc.py中两个函数checkAccF、createAccF的定义代码完全没被执行 - 最终CheckAcc模块加载失败,run.py没有成功导入到目标函数,调用时就会触发
NameError
解决方法
推荐按优先级选择以下方案:
方案1:改用函数参数传递变量(最佳实践)
彻底取消循环导入,将需要的变量通过参数传递给函数,修改后代码如下:
CheckAcc.py删除顶部的from run import username, password, id语句,修改函数定义:# 其余import保持不变 def checkAccF(username, acc_id, password): with open(os.devnull, 'w') as DEVNULL: try: # 原有逻辑不变,直接使用传入的三个参数即可 def createAccF(username, acc_id, password): with open(os.devnull, 'w') as DEVNULL: try: # 原有逻辑不变对应修改run.py的函数调用语句即可(建议把变量
id改名为acc_id,避免和Python内置函数id()重名引发隐藏问题):acc_id = 'C1' username = input('Username: ') password = getpass() checkAccF(username, acc_id, password) createAccF(username, acc_id, password)方案2:延迟导入变量(修改量最小)
不修改函数参数,把CheckAcc.py的导入语句移到函数内部,只有函数被调用时才执行导入,此时run.py已经完成变量定义和模块导入,不会触发循环问题:# CheckAcc.py删除顶部的from run import ...语句,修改函数部分 def checkAccF(): from run import username, id, password with open(os.devnull, 'w') as DEVNULL: try: # 原有逻辑不变 def createAccF(): from run import username, id, password with open(os.devnull, 'w') as DEVNULL: try: # 原有逻辑不变
内容的提问来源于stack exchange,提问作者HipYThON0
相关产品推荐
相关产品推荐

