我想创建一个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的解析器,以便使这个技巧有效,但是没有找到任何东西。还有一个简单的原因,为什么这个不存在,我没有想到。
答案 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}}
这样可行,但这是您尝试解决的真正问题吗?这似乎是一个非常不直观的用例,可以通过其他方式更好地解决。