CircuitPython中不使用exec()创建digitalio.DigitalInOut对象的方法
可行实现方案
你完全可以通过Python内置的getattr()方法动态获取引脚对象替代exec写法,同时通过分层的兼容驱动实现双平台无缝适配:
1 CircuitPython原生无exec实现
核心思路是通过getattr()从board模块动态提取对应编号的引脚常量,完全规避exec的作用域兼容问题和安全风险:
import digitalio import board class led: def __init__(self, pin_number): # 动态获取board.GPxx引脚对象 pin_obj = getattr(board, f"GP{pin_number}") self.pin = digitalio.DigitalInOut(pin_obj) # 配置为输出模式,对应MicroPython的Pin.OUT参数 self.pin.direction = digitalio.Direction.OUTPUT
2 双平台兼容方案
你只需要拆分两个独立的驱动文件,主程序根据运行环境选择导入即可,业务逻辑完全不需要修改:
MicroPython驱动文件(led_mpy.py)
from machine import Pin class led: def __init__(self, pin_number): self.pin = Pin(pin_number, Pin.OUT) # 统一对外接口 def on(self): self.pin.value(1) def off(self): self.pin.value(0)
CircuitPython驱动文件(led_cpy.py)
import digitalio import board class led: def __init__(self, pin_number): pin_obj = getattr(board, f"GP{pin_number}") self.pin = digitalio.DigitalInOut(pin_obj) self.pin.direction = digitalio.Direction.OUTPUT # 和MicroPython版保持完全一致的对外接口 def on(self): self.pin.value = True def off(self): self.pin.value = False
3 主程序调用示例
主程序可以自动判断平台选择驱动,调用方式完全符合你的要求:
# 自动识别运行环境导入对应驱动 try: import digitalio from led_cpy import led except ImportError: from led_mpy import led # 调用方式无需修改 b1 = led(pin_number=1) # 统一方法调用 b1.on()
内容的提问来源于stack exchange,提问作者Llamax
相关产品推荐
相关产品推荐

