Python如何跨文件访问另一文件嵌套函数内定义的全局变量
问题根因
- 直接调用
my_func()报错的核心原因是:my_func是装饰器函数,定义要求必须传入一个被装饰的函数作为参数,空参调用不符合函数定义要求。 - 原有
read.py存在两处语法错误:my_func中return wrapper缩进层级错误,不应该放在wrapper函数内部;another_func的函数体缺少缩进。 - 全局变量
directory仅在args.dir为空的分支中被定义,其他执行路径下该变量不存在,直接访问会触发属性错误。
修正方案
第一步:修改read.py代码
首先修复语法问题,同时提前初始化全局变量避免未定义问题,并且把执行逻辑放到主入口判断中,避免导入时自动执行:
import argparse import os from config import data_dir import pandas as pd # 提前初始化全局变量,避免未定义报错 directory = None def my_func(func): def wrapper(): global directory parser = argparse.ArgumentParser() parser.add_argument('--dir') args = parser.parse_args() if args.dir is None: args.dir = input('Enter data directory:') directory = args.dir path = os.path.join(data_dir, directory, 'new.csv') data = pd.read_csv(path) return data func() # 修正缩进,return wrapper要和wrapper同级 return wrapper @my_func def another_func(): # 修正缩进,函数体要缩进 if not any(fname.startswith('car') for fname in os.listdir(data_dir)): print('directory is empty') # 放到主入口判断,只有直接运行read.py时才执行,导入时不执行 if __name__ == "__main__": another_func()
第二步:修改new.py代码
不需要直接调用装饰器my_func,直接调用已经被装饰完成的another_func触发逻辑执行,之后就可以正常访问全局变量directory:
import read # 触发装饰后的逻辑执行,执行完成后directory会被赋值 read.another_func() # 访问全局变量 print(read.directory)
内容的提问来源于stack exchange,提问作者zara kolagar
相关产品推荐
相关产品推荐

