python函数是否可以知道它何时';有人在叫什么?

python函数是否可以知道它何时';有人在叫什么?,python,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] 我试着查看in

我想创建一个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的解析器,寻找使这个技巧起作用的方法,但没有找到任何结果。这可能还有一个简单的原因,我没有想到它为什么不存在。

补充我的评论:

def f(lst=False):
    return True if lst else False

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

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

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

def f():
    try:
        raise ValueError
    except Exception as e:
        if e.__traceback__.tb_frame.f_back.f_code.co_name == '<listcomp>':
            return True
不过,这并不值得推荐。真的,不是

注 目前,它只检测请求的列表理解。它不会检测发电机的使用情况。例如:

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

生成器必须生成True,而不是其他情况下生成的值。在iterable上调用
list()
怎么样?这应该返回FALSE吗?只需在函数中添加一个参数,根据需要更改行为。试图变得“聪明”只会让后来试图理解你的代码的人感到困惑。我的直觉告诉我,你有一个更深层次的问题,这就是为什么会出现这个问题。真正的问题是什么?@GreenAsJade肯定-但这里有一个“对xy过敏的问题”。这个问题并非“不清楚,因为我们不知道它试图解决什么问题”。事实上,这个问题非常清楚,这是一个肯定/否定的问题。的确,我们不知道这个问题解决了什么问题,但这并没有把它纳入xy问题阵营。事实证明,这个问题有一个创造性的答案。如何做到这一点真的很有趣。回答者警告说这不是好的做法。那很好。我希望你能解释为什么会有人投反对票,而不仅仅是高兴被触发。我们都可以通过这种方式学到一些东西。谢谢:)我没有投反对票,但我怀疑这是因为您的实现与规范不匹配:)然而,因为规范没有理由,有人可能会说这是一个很好的创造性解决方案!所以我投了更高的票!对于那些感兴趣的人来说,这似乎只适用于python3,但是是的,这正是我想要的!
>>> print(list(f() for x in range(10)))
[None, None, None, None, None, None, None, None, None, None]