我正在浏览一些使用attrs模块的代码。因此,在调试单步执行某些代码时,我最终会得到不作为实际文件存在但自动生成的源。
这个问题是关于使用什么 python 技术来实现这种行为的。用于示例的实际库或示例本身只是展示概念的具体内容。
例子
安装库
virtualenv -p python3 labgrid-venv
source labgrid-venv/bin/activate
git clone https://github.com/labgrid-project/labgrid
cd labgrid
pip install -r requirements.txt
pip install .
表现出行为(test.py
)的代码:
from labgrid import Target
from labgrid.resource import RawSerialPort
rpi = Target("RPi")
import pdb
pdb.set_trace()
raw_serial_port = RawSerialPort(rpi, None, port="/dev/ttyUSB0", speed=115200)
执行该代码并单步执行会RawSerialPort
导致调试器在自动生成的源中发现自己:
(venv) project_root$ python test.py
[0] > project_root/test.py(15)<module>()
-> raw_serial_port = RawSerialPort(rpi, None, port="/dev/ttyUSB0", speed=115200)
(Pdb++) s
--Call--
[1] > <attrs generated init labgrid.resource.serialport.RawSerialPort>(1)__init__()
-> def __init__(self, target, name, port=attr_dict['port'].default, speed=attr_dict['speed'].default):
(Pdb++)
注意def __init__
定义,实际源文件中不存在这样的定义,而是由attrs
.
我的问题是这里有什么 python 机制来实现这种甚至欺骗调试器的行为?