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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:15:04