首页 > 解决方案 > 有什么方法可以判断函数对象是 lambda 还是 def?

问题描述

考虑以下两个函数:

def f1():
    return "potato"

f2 = lambda: "potato"
f2.__name__ = f2.__qualname__ = "f2"

缺少对原始源代码的反省,有什么方法可以检测到它f1是一个 deff2还是一个 lambda?

>>> black_magic(f1)
"def"
>>> black_magic(f2)
"lambda"

标签: pythonlambdapython-datamodel

解决方案


您可以检查代码对象的名称。与函数的名称不同,代码对象的名称不能重新分配。lambda 的代码对象的名称仍然是'<lambda>'

>>> x = lambda: 5
>>> x.__name__ = 'foo'
>>> x.__name__
'foo'
>>> x.__code__.co_name
'<lambda>'
>>> x.__code__.co_name = 'foo'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: readonly attribute

语句不可能def定义代码对象名称为 的函数'<lambda>'。可以创建后替换函数的代码对象,但这样做很少见而且很奇怪,可能不值得处理。同样,这不会处理通过手动调用types.FunctionType或创建的函数或代码对象types.CodeType。我看不到任何处理__code__重新分配或手动创建的函数和代码对象的好方法。


推荐阅读