检测源自多行字符串的函数调用

问题描述 投票:0回答:1

我想确定是否从多行字符串内部调用函数(在字符串插值期间)。

这是此类函数的测试示例:

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

assert not inside_multiline_string()

理想情况下,这不是通过手动解析源代码来实现的,而是依赖于 Python 的一些内置自省功能。使其工作稳健。

此外,它应该传递地工作,即如果父调用位于多行字符串内,则仍应将其标记为在多行字符串内。

这是一个更复杂的测试示例

def foo():
    return inside_multiline_string()

def bar():
    return foo()

s = f"""\
{bar()}"""
assert s == "True"
python reflection
1个回答
0
投票

您可以使用可应用于任何函数的装饰器的使用来检查它是否是从多行字符串内部调用的。

import inspect

def is_called_from_multiline_string(func):
    def wrapper(*args, **kwargs):
        frame = inspect.currentframe().f_back
        try:
            code = inspect.getsourcelines(frame)[0]
            if any(line.strip().startswith(('"""', "'''")) for line in code):
                return f"True"
        finally:
            del frame

        return func(*args, **kwargs)

    return wrapper

@is_called_from_multiline_string
def inside_multiline_string():
    return "False"

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

assert inside_multiline_string() == "False"

@is_called_from_multiline_string
def foo():
    return inside_multiline_string()

@is_called_from_multiline_string
def bar():
    return foo()

s = f"""\
{bar()}"""
assert s == "True"
© www.soinside.com 2019 - 2024. All rights reserved.