【发布时间】:2019-02-11 01:21:21
【问题描述】:
在尝试判断 a function is called with the @decorator syntax 是否为inspect 时,我们发现在查看从超类继承的装饰类时,inspect 具有不同的行为。
在 Windows 10 下使用 CPython 3.6.2 发现以下行为。
它也在 Linux 64 位下的 CPython 3.7.0 中重现。
import inspect
def decorate(f):
lines = inspect.stack()[1].code_context
print(f.__name__, lines)
return f
@decorate
class Foo:
pass
@decorate
class Bar(dict):
pass
输出
Foo ['@decorate\n']
Bar ['class Bar(dict):\n']
为什么继承会改变inspect的行为?
【问题讨论】:
-
可以在这里在 Python 3.6 上重现,考虑到其他一些实验的结果,这让我感到惊讶。
-
我可以在 Mac、Linux 和 repl.it 上的交互式解释器(stock 和 IPython)中重现 3.6。但是当我将相同的代码放入脚本时,对于 Linux 和 repl.it 上的两个函数,code_context 都是
None。 -
我可以在脚本中进行复制,除非您使用 IPython 之类的工具,否则我不希望它以交互方式工作,因为交互模式不应该保存源代码。
-
lineno相差 1,as you can see on repl.it,缩小了查看范围。 -
用
dis反汇编显示加载基类对象的LOAD_NAME的行号提前了,这在没有基类的情况下不会发生。
标签: python python-3.6 decorator python-decorators inspect