python函数可以知道它何时被列表推导调用?

时间:2016-10-06 05:04:11

标签: python

我想创建一个python函数,当它从列表推导中调用时表现不同:

def f():
    # this function returns False when called normally,
    # and True when called from a list comprehension
    pass

>>> f()
False
>>> [f() for _ in range(3)]
[True, True, True]

我试着查看inspect模块,dis模块和lib2to3的解析器,以便使这个技巧有效,但是没有找到任何东西。还有一个简单的原因,为什么这个不存在,我没有想到。

2 个答案:

答案 0 :(得分:8)

您可以通过以下方式检查堆栈框架来确定这一点:

def f():
    try:
        raise ValueError
    except Exception as e:
        if e.__traceback__.tb_frame.f_back.f_code.co_name == '<listcomp>':
            return True

然后:

>>> print(f())
None
>>> print([f() for x in range(10)])
[True, True, True, True, True, True, True, True, True, True]

虽然不推荐。真的,不是。

注意

目前只能按要求检测列表推导。它不会检测发电机的使用。例如:

>>> print(list(f() for x in range(10)))
[None, None, None, None, None, None, None, None, None, None]

答案 1 :(得分:0)

Addon到我的评论:

{{1}}

这样可行,但这是您尝试解决的真正问题吗?这似乎是一个非常不直观的用例,可以通过其他方式更好地解决。