我有一个围绕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(或其他通用的随机数)线?
答案 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]
肮脏。
尽管如此,你现在所做的事情并没有错。