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

如何在函数中获取传入的PySpark DataFrame实例的变量名?

获取PySpark DataFrame传入函数时的变量名

核心思路

通过Python的inspect模块抓取函数调用处的源码上下文,再用正则或AST解析提取传入的变量名——因为PySpark DataFrame不可变且没法统一添加name属性,这种从调用上下文逆向解析的方式是最可行的替代方案。

实现方案(正则解析版)

import inspect
import re
from pyspark.sql import DataFrame

def display(df: DataFrame):
    # 获取调用display函数的上层栈帧
    caller_frame = inspect.currentframe().f_back
    # 提取调用行的源码文本
    caller_line = inspect.getsource(caller_frame).strip()
    
    # 用正则匹配display的参数部分
    match_result = re.match(r'display\((.*?)\)', caller_line)
    if match_result:
        df_name = match_result.group(1).strip()
        # 这里替换成你的实际展示逻辑
        print(f"当前展示DataFrame: {df_name}")
        df.show()
    else:
        # 处理参数不是直接变量名的情况(比如表达式)
        print("无法识别DataFrame变量名")
        df.show()

# 测试示例
df_on_step_42 = spark.createDataFrame([(1, "a"), (2, "b")], ["id", "val"])
display(df_on_step_42)

更鲁棒的AST解析版

如果要支持复杂的源码格式(比如参数跨行),可以用AST解析代替正则:

import inspect
import ast
from pyspark.sql import DataFrame

def display(df: DataFrame):
    caller_frame = inspect.currentframe().f_back
    caller_line = inspect.getsource(caller_frame).strip()
    try:
        # 把源码解析成抽象语法树
        tree = ast.parse(caller_line)
        call_node = tree.body[0].value
        arg_node = call_node.args[0]
        # 判断参数是否是直接变量名
        if isinstance(arg_node, ast.Name):
            df_name = arg_node.id
            print(f"当前展示DataFrame: {df_name}")
            df.show()
        else:
            print("传入的不是直接变量名(比如表达式)")
            df.show()
    except Exception as e:
        print(f"解析变量名失败: {str(e)}")
        df.show()

注意事项

  • 仅当调用display时传入直接变量名才有效,如果传入的是表达式(比如display(df.filter("id > 1"))),无法解析出有意义的名称,必须做好降级处理。
  • 依赖调用处的源码格式,如果调用时参数拆成多行,正则版本需要调整规则,AST版本兼容性更好。

内容的提问来源于stack exchange,提问作者ajonvill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:55:19