如何实现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的插值流程中:
- 跳过当前函数的栈帧,遍历调用链中的上层栈帧
- 检查栈帧对应的代码行是否属于未闭合的多行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
相关产品推荐
相关产品推荐

