擅长:python、mysql、java
<p>我有一个(有点黑)的解决方案,它依赖正则表达式从字符串中解析函数名。可能会有一个更干净的解决方案,但至少用这个是我能找到的最好的。你知道吗</p>
<pre><code>import inspect
import re
function_from_call = re.compile("\w+(?=\(\))")
def foo():
_, call_frame, *_ = inspect.stack()
_, _, _, _, call, *_ = call_frame
print(re.search(function_from_call, str(call)).group())
bar = foo
bar() # prints bar
foo() # prints foo
</code></pre>
<p>简要说明:首先,我抓取调用的inspect框架,该框架导致对该函数的调用。然后,我从这个框架中提取实际的调用字符串,并对这个调用字符串应用regex,它只给出函数名。你知道吗</p>
<p>注意:在解释器shell中,inspect的行为不同,我上面的代码产生错误,因为我的regex不能匹配实际的函数名。@user2357112在对这个问题的评论中指出了一个额外的警告:一个调用直接绑定到一个名称并不明显,如</p>
<pre><code>l = [foo]; l[0]()
</code></pre>
<p>当从脚本运行时,我的解决方案将正确处理简单的重命名案例(如本问题中给出的案例),但我不主张使用它,因为上面提到的拐角案例会导致混淆错误。你知道吗</p>