Python全局导入遇NameError:error函数未定义问题求助
解决import * 引发的NameError问题
问题场景
我有三个Python文件:
- message.py - 定义带颜色的日志输出函数:
def error(message): print(f"\033[91m{message}\033[00m") def warning(message): print(f"\033[93m{message}\033[00m") def info(message): print(f"\033[96m{message}\033[00m") def success(message): print(f"\033[92m{message}\033[00m")
- imports.py - 全局导入文件,集中管理所有依赖:
import humps import inflect import json import visitor import logging from message import * error('hi') import os import re import subprocess import sys
- visitor.py - 业务代码文件,通过全局导入获取依赖:
from imports import * def visitChildren(node, analyze): nodeType = type(node).__name__ if nodeType == 'dict': for childNode in node: childNodeType = type(node[childNode]).__name__ try: if (childNodeType == 'dict'): analyze(node[childNode]) visitChildren(node[childNode], analyze) except Exception as ex: error(f'\t{ex}') if nodeType == 'list': for index in range(len(node)): visitChildren(node[index], analyze) def visit(path, analyze): if path == '': pass else: try: file = open(path) data = json.load(file) visitChildren(data, analyze) except Exception as ex: error(f'\tFile {path} has no AST or its AST can not be loaded') error(f'\t{ex}')
现象:imports.py中调用error('hi')完全正常,但visitor.py执行时抛出错误:
NameError: name 'error' is not defined. Did you mean: 'OSError'?
问题根源
这是循环导入+导入顺序导致的问题:
imports.py在开头就导入了visitor,此时visitor.py会立刻执行from imports import *- 但此时
imports.py还没执行到from message import *这一行,error等函数还没被添加到imports模块的命名空间中 - 所以
visitor.py通过from imports import *无法获取到error函数
解决方案
调整imports.py的导入顺序,把import visitor移到所有导入语句的最后,确保在导入visitor之前,所有需要导出的内容都已经加载完成:
修改后的imports.py代码:
import humps import inflect import json import logging from message import * import os import re import subprocess import sys import visitor # 移至最后 error('hi')
这样修改后,当imports.py执行到import visitor时,from message import *已经执行完毕,error等函数已经存在于imports的命名空间中,visitor.py通过from imports import *就能正常获取到error函数了。
内容的提问来源于stack exchange,提问作者Hasan
相关产品推荐
相关产品推荐

