Python访问被装饰函数返回值:调用装饰后函数返回None排查
问题排查
你代码存在3个核心错误,按优先级排序如下:
1. 装饰器缩进错误(最核心原因)
你代码里的return wrapper缩进层级错误,写在了wrapper函数内部:
def my_func(func): def wrapper(): if xxx: # 逻辑省略 return path return func() return wrapper # 这里缩进错误,属于wrapper内部代码,永远不会被执行
这会导致装饰器my_func执行后没有返回任何可调用对象,被装饰后的another_func实际被赋值为None,自然不可能执行原函数的逻辑。
修复方式:把return wrapper取消一层缩进,和def wrapper()同级,作为my_func的返回值:
def my_func(func): def wrapper(): if any(fname.startswith('gold') for fname in os.listdir(os.path.join(data_dir, 'fill'))): 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') return path return func() return wrapper # 调整缩进后
2. 被装饰函数路径判断逻辑错误
你的old_data.csv存放在data/fill目录下,但你判断的是data_dir(即data根目录)下有没有old开头的文件,os.listdir(data_dir)只能拿到fill文件夹,永远匹配不到old开头的文件,判断逻辑完全失效。
3. 被装饰函数变量、逻辑错误
- 未定义变量:代码里的
data.dir不存在,你没有声明过data变量,此处应该填写子目录名fill - 路径拼接错误:不需要嵌套调用
os.path.join,直接写三层拼接即可 - 判断逻辑写反:你要的是存在old开头的文件时读取内容,现在写的
if not any(...)是不存在时才进入分支,逻辑完全相反
修复后完整可运行代码
import argparse import os # 假设你config里的data_dir指向的是my_dir/data目录 from config import data_dir import pandas as pd def my_func(func): def wrapper(): if any(fname.startswith('gold') for fname in os.listdir(os.path.join(data_dir, 'fill'))): 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') return path return func() return wrapper @my_func def another_func(): # 调整判断路径到data/fill目录,同时去掉not,逻辑改为存在old开头文件时进入分支 if any(fname.startswith('old') for fname in os.listdir(os.path.join(data_dir, 'fill'))): # 修正路径和变量错误 path = os.path.join(data_dir, 'fill', 'old_data.csv') data_ = pd.read_csv(path) return data_ print(another_func())
内容的提问来源于stack exchange,提问作者zara kolagar
相关产品推荐
相关产品推荐

