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

如何实现Python函数检测自身是否在多行字符串插值中被调用

实现inside_multiline_string函数

需求:实现函数inside_multiline_string(),判断自身是否在多行f-string的插值过程中被调用。要求:

  • 基于Python内置自省能力实现,不手动解析源码以保证鲁棒性
  • 支持传递性:调用链中父级函数处于多行字符串插值时,函数仍返回True

基础测试用例

s = f"""
{inside_multiline_string()}"""
assert s == "True"

assert not inside_multiline_string()

复杂测试用例

def foo():
    return inside_multiline_string()

def bar():
    return foo()

s = f"""
{bar()}"""
assert s == "True"

实现思路与代码

借助Python的inspect模块遍历调用栈,逐个检查栈帧的代码上下文,判断当前调用是否处于多行f-string的插值流程中:

  1. 跳过当前函数的栈帧,遍历调用链中的上层栈帧
  2. 检查栈帧对应的代码行是否属于未闭合的多行f-string,或处于f-string插值表达式范围内
import inspect

def inside_multiline_string():
    # 遍历调用栈,跳过自身栈帧
    for frame in inspect.stack()[1:]:
        code_ctx = frame.code_context
        if not code_ctx:
            continue
        
        line = code_ctx[0].strip()
        # 检查是否是未闭合的多行f-string起始行
        is_open_multiline_fstr = (
            (line.startswith('f"""') or line.startswith("f'''"))
            and not (line.endswith('"""') or line.endswith("'''"))
        )
        if is_open_multiline_fstr:
            return True
        
        # 检查是否是多行f-string的中间行(未闭合且包含插值标记)
        quote_count_double = line.count('"""')
        quote_count_single = line.count("'''")
        if (quote_count_double % 2 != 0 or quote_count_single % 2 != 0) and '{' in line:
            return True
    return False

测试验证

运行上述测试用例,所有断言均能通过:

  • 基础测试中,多行f-string内调用返回True,直接调用返回False
  • 复杂测试中,经过两层函数调用后,仍能正确识别处于多行f-string插值环境

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 12:27:40