Python最佳实践:除了pass之外还尝试其他方法吗?

Python最佳实践:除了pass之外还尝试其他方法吗?,python,python-3.x,Python,Python 3.x,小问题,对我来说,学习最佳实践比什么都重要。如果有更好的方法,请批评:) 基本上,我有多个GPIO输入,对应于一个按钮按下。例如,如果用户按下按钮2,我从引脚5和引脚6获得高值 所以在我的代码中,我需要将高引脚映射到一个“按钮”id 为此,我使用了一个2D列表,其中元素的索引将对应于按钮的“id” buttons = [ [], [PIN_5], [PIN_5, PIN_6], [PIN_6], [PIN_6, PIN_19], ... ] 我使

小问题,对我来说,学习最佳实践比什么都重要。如果有更好的方法,请批评:)

基本上,我有多个GPIO输入,对应于一个按钮按下。例如,如果用户按下按钮2,我从引脚5和引脚6获得高值

所以在我的代码中,我需要将高引脚映射到一个“按钮”id

为此,我使用了一个2D列表,其中元素的索引将对应于按钮的“id”

buttons = [
    [],
    [PIN_5],
    [PIN_5, PIN_6],
    [PIN_6],
    [PIN_6, PIN_19],
    ...
]
我使用一个线程循环来检查管脚值,并将高状态管脚存储在一个新列表中

因此,一旦按下一个按钮,一个新的列表将显示哪些引脚较高

pins_high = [PIN_5, PIN_6]
这就是我的最佳实践问题所在,为了将这些管脚映射到映射列表中的按钮“id”,我使用了一种除传递之外的尝试方法

button_pressed = 0
try:
    button_pressed = buttons.index(pins_high)
except ValueError:
    pass
这是最佳实践吗?在我看来,这似乎是一个很好的解决方案,但我是否忽视了像这样使用try/except/pass的任何可能的泄漏/影响

干杯, 杰米:不。 第一件事第一:每当您必须检索给定键的值时,只需使用字典:

buttons = {
    (): 0, 
    (PIN_5,): 1,
    (PIN_5, PIN_6): 2, 
    ...
}  
请注意:(1)值可以是任意的,无需进行修改,这样组合的插入顺序就需要与所需的数值匹配;(2)搜索顺序是任意的,O[1],每次按下按钮都不进行线性搜索,以及(3)字典有
.get
方法,允许您在不需要处理异常的情况下检查包含

此外,还有一点“高级”-您可以使用“frozenset”对象作为键,因此您不依赖于按钮顺序:

F = frozenset

buttons = {
    F(): 0, 
    F((PIN_5,)): 1,
    F((PIN_5, PIN_6)): 2, 
    ...
}  

...

button_pressed = buttons.get(F(pins_high), 0)
首先,使用a更有效(查找时间为
O(1)
,而不是
列表。索引
O(n)
),并且借助该方法还减少了对
try/except
的需要。“问题”是dicts的键需要是可散列的,而列表不是。因此,您需要将它们转换为元组(可散列):

按钮={
(插脚5):1,,
(插脚5,插脚6):2,
(插脚6):3,,
(插脚6,插脚19):4
}
现在使用检查键的方法,如果找不到,它将返回第二个
default
参数:

button_pressed = buttons.get(tuple(pins_high), 0)


请注意,这是“订单敏感的”-这意味着
[PIN_6,PIN_5]
将返回
0
,而不是
2

如果在内部,则捕获错误并打印或记录错误。你为什么要通过声明。请将此作为参考。您可能应该使用dict代替。谢谢。我想传递,因为如果.index()函数引发ValueError异常,我不需要发生任何事情。根据文档,如果找不到您“搜索”的值,它会引发此异常。所以我在这里用它来表示,“如果我的PIN存在,给我索引,如果没有,什么也不做”@aviboy2006:当你捕获到一个目标异常,并且该异常指示预期的状态,而不是错误时,没有理由打印或记录它,如果
附加到
if
,则需要打印/登录
否则:
Exception:pass
(或者稍差一点的
Exception:pass
)是不允许的,如果
try
块很大并且可能以许多不同的方式引发
ValueError
,则
除外ValueError:pass
将是一个问题,但是这个用例很好。您应该使用python字典。仅在您确实需要时使用异常,并且仅用于异常处理。谢谢!感谢您的帮助和解释:)