python - 有什么方法可以判断函数对象是 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"
解决方案
您可以检查代码对象的名称。与函数的名称不同,代码对象的名称不能重新分配。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__
重新分配或手动创建的函数和代码对象的好方法。
推荐阅读
- python - 激活虚拟环境并通过一次调用 subprocess.Popen 来运行命令,shell=False 可能吗?
- google-sheets - 如何在 Google Forms 问题描述中嵌入 html
- postgresql - Postgresql:事务 - 异常程序问题
- .htaccess - 如何使用 utm 参数重定向链接?
- spring-boot - 在测试中运行应用程序时如何解决 GOOGLE_APPLICATION_CREDENTIALS,Spring Boot?
- c++ - 在过程之间传递变量
- gooddata - GoodData 图表组件抛出 TypeError 错误:item.predicate 不是从配置设置颜色的函数
- excel - Excel #DIV/0!计算增加的问题
- php - 如何使用 SQL LIKE 运算符在 PHP 中使用 PDO 准备语句
- php - 睡眠进程过多(MySQL)