我目前的项目是一个高级抽象包,用于在那些漂亮的SoC-计算机上进行GPIO编程(Raspberry Pi、Cubieboard、Beaglebone Black、Pandaboard等)。我的目标之一是能够使用不同的GPIO模块作为后端在不同的板上运行相同的代码,比如Raspberry上的RPi.GPIO,或者Cubieboard上的SUNXI_GPIO。
目前,我有这样的代码:
class Pin(object):
def __init__(self, gpio, direction, pud=None):
self.gpio = gpio
self.direction = direction
self.pud = pud
_GPIO_BACKEND.setuppin(self.gpio, self.direction, self.pud)
def __str__(self):
return self.gpio
class InputPin(Pin):
"""docstring for InputPin"""
def read(self):
_GPIO_BACKEND.read(self.gpio)
class OutputPin(Pin):
"""docstring for OutputPin"""
def high(self):
_GPIO_BACKEND.high(self.gpio)
def low(self):
_GPIO_BACKEND.low(self.gpio)我希望_GPIO_BACKEND通过加载后端的上下文管理器进行设置。后端本身看起来如下(RPi.GPIO示例):
from RPi import GPIO as _GPIO
def init(numberscheme='bcm'):
"""docstring for init"""
if numberscheme.lower() == 'bcm':
_GPIO.setup(_GPIO.BCM)
elif numberscheme.upper() == 'board':
_GPIO.setup(_GPIO.BOARD)
def setuppin(id, direction, pullupdown=None):
"""docstring for setuppin"""
if direction.lower() == 'in':
dir = _GPIO.IN
elif direction.lower() == 'out':
dir = _GPIO.OUT
else:
raise ValueError
if pullupdown is None:
pud = _GPIO.PUD_ # TODO
elif pullupdown.lower() == 'up':
pud = _GPIO.PUD_UP
elif pullupdown.lower() == 'down':
pud = _GPIO.PUD_DOWN
else:
raise ValueError
_GPIO.setmode(id, dir, pud)
def cleanup():
"""docstring for cleanup"""
_GPIO.cleanup()
def high(id):
"""docstring for high"""
_GPIO.output(id, _GPIO.HIGH)
def low(id):
"""docstring for low"""
_GPIO.output(id, _GPIO.LOW)
def read(id):
"""docstring for read"""
return _GPIO.input(id)我不喜欢的是依赖一个伪不可见的全局变量(_GPIO_BACKEND)。
什么是一个好的,适当的,和pythonic的方式来编程到多个后端这样?
发布于 2015-07-20 18:31:58
你不能用经典的面向对象的概念来处理这个问题吗?例如,每个后端可以实现为一个具有公共接口的类,InputPin和OutputPin类将以一种组合的方式使用它们。
https://softwareengineering.stackexchange.com/questions/286045
复制相似问题