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 メカニズムが用意されているのですか?