提问人:Azmy Rajab 提问时间:8/3/2023 更新时间:8/3/2023 访问量:33
在 python 中,可以询问内部函数的父函数吗?
In python, can an inner function be interrogated about its parent function?
问:
假设我们有一个函数,用 my_module.py 定义:
def make_function(scalar: float) -> Callable[[float], float]:
def increment(x: float) -> float:
return x + scalar
return increment
在运行时,我可以访问实时的内部函数对象(我知道所有相关代码都是在my_module.py中定义的)。
>> make_function(2)
<function my_module.make_function.<locals>.increment(x: float) -> float>
问:有没有一种优雅的方法可以从活动对象中获取有关其父函数的信息?我特别感兴趣的是动态生成格式的字符串。我正在寻找一种解决方案,该解决方案也适用于任意数量的嵌套级别(即 )。"my_module.make_function.increment"
"my_module.outer_func_1.outer_func_2.inner_func"
请注意,根据我之前的代码示例,我的问题的答案似乎(几乎)嵌入在函数对象中。但不确定它背后的内部结构以及如何访问它们。__repr__
我试过了什么?
- Inspect module:但仅返回模块路径
inspect.getmodule(func).__name__
func.__code__.co_*
,但找不到指向父函数的方法- 玩 ,但这似乎比需要的要复杂
func.__globals__
理想情况下,我希望避免装饰/修改定义的功能,而只能通过检查对象本身来得出答案。非常感谢有关如何进行的任何帮助!
答:
2赞
juanpa.arrivillaga
8/3/2023
#1
我认为最安全的选择是使用:__qualname__
In [6]: def foo():
...: def bar():
...: def baz():
...: return 42
...: return baz
...: return bar()
...:
In [7]: f = foo()
In [8]: f
Out[8]: <function __main__.foo.<locals>.bar.<locals>.baz()>
In [9]:
In [9]: f.__qualname__
Out[9]: 'foo.<locals>.bar.<locals>.baz'
所以,像这样:
In [11]: f.__qualname__.replace("<locals>.", "")
Out[11]: 'foo.bar.baz'
评论
f = make_function(2); f.__repr__().replace("<locals>.", "")
__repr__
f.__qualname__
__repr__
f.__qualname__
<locals>
__qualname__