You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:06:03