优化RPi.GPIO中类似事件回调的代码部分(Raspberry Pi上的python)

时间:2015-11-21 22:47:54

标签: python raspberry-pi

我有一个围绕RPi.GPIO模块构建的工作代码,并希望优化某个部分,我认为它不适合美观(不是整体,只是代码的一部分) - 除了我没有&#39不知道怎么做。

这是一个举例说明上下文的代码。 "犯罪"行位于评论# question: how to optimize these lines?下方。我明确要求调用是个体的,其中一个原因是"在这种情况下,回调函数是按顺序运行的,而不是同时运行的#34; (引自文档),我更喜欢使用它。

可以找到RPi.GPIO的文档here,但是阅读量不大,我认为在其他情况下也可以找到回调样式。

#!/usr/bin/env python

# RPi.GPIO module for Raspberry Pi https://pypi.python.org/pypi/RPi.GPIO
import RPi.GPIO as GPIO
import sys
import os
import time

class test(object):
    def __init__(self):
        pass

    def main(self):
        # consider BCM port numbering convention
        GPIO.setmode(GPIO.BCM)
        ports = [16, 20, 23]    # 3 ports only for this example, might be n ports
                                # actual port number is not relevant to question
        for i, port in enumerate(ports):
            # setup port direction & internal pull-up
            GPIO.setup(port, GPIO.IN, pull_up_down=GPIO.PUD_UP)
            # setup interrupt movement sense
            GPIO.add_event_detect(port, GPIO.FALLING)

        # question: how to optimize these lines? (compact in a loop or something)
        GPIO.add_event_callback(16, self.do_something_1)
        GPIO.add_event_callback(20, self.do_something_2)
        GPIO.add_event_callback(23, self.do_something_3)
        # etc. (might be n event callbacks, not just 3)

        while True:
            time.sleep(1)

    # some internal calls or even as separate external file(name) modules
    def do_something_1(self, from_port):    # for first port in ports
        print("called from port %s" % (from_port))
    def do_something_2(self, from_port):    # for second port in ports
        print("called from port %s" % (from_port))
    def do_something_3(self, from_port):    # for third port in ports
        print("called from port %s" % (from_port))
    # etc. (might be n defined functions, not just 3)

if __name__ == "__main__":
    try:
        app = test()
        app.main()
    except KeyboardInterrupt:
        print (" exit via Ctrl+C")
    finally:
        GPIO.cleanup()
        try:
            sys.exit(0)
        except SystemExit:
            os._exit(0)

所以,问题:我应该怎样处理那些3(或其他通用的随机数)线?

1 个答案:

答案 0 :(得分:2)

如何确定回调中的数字/名称?如果它是任意的,那你现在可能做得很好。

那就是说,你可以创建一个数字列表 - 函数元组,然后在for循环中调用它们全部?但这并不是更好的imho。

callback_pairs = [(16, "do_something_1"), (20, "do_something_2"), (23, "do_something_3")]
for n, fname in callback_pairs: 
    GPIO.add_event_callback(n, getattr(self, fname))

您也可以通过直接引用对列表中的getattr来消除self.do_something_[123]肮脏。

尽管如此,你现在所做的事情并没有错。