You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 21:42:02