1

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

4

2 に答える 2