Python最佳实践:try except pass?

3

小问题,主要是为了让我学习最佳实践。如果有更好的方法,请批评指正 :)

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

所以在我的代码中,我需要将高电平引脚映射到“按钮” ID。

为此,我使用一个二维列表,其中元素的索引将对应于按钮的“ID”。

buttons = [
    [],
    [PIN_5],
    [PIN_5, PIN_6],
    [PIN_6],
    [PIN_6, PIN_19],
    ...
]

我正在使用线程循环来检查引脚值,并将高电平的引脚存储在一个新列表中。

因此,一旦按下按钮,新列表将包含高电平引脚。

pins_high = [PIN_5, PIN_6]

所以这就是我最佳实践问题的出处,为了将这些引脚映射到映射列表中的按钮“id”,我使用了一个try except pass的方法

button_pressed = 0
try:
    button_pressed = buttons.index(pins_high)
except ValueError:
    pass

这是最佳实践吗?在我看来,这是一个漂亮而简洁的解决方案,但是我是否忽略了使用try/ except/ pass可能存在的任何泄漏/影响?

谢谢, 杰米


如果在except语句块中,则捕获错误并打印或记录错误。为什么要使用pass语句。请参考https://github.com/aviboy2006/flask-rest-api/blob/master/app.py。 - Avinash Dalvi
1
你应该使用字典(dict)代替。 - Tomerikoo
谢谢。我想要通过,因为如果 .index() 函数引发 ValueError 异常时,我不需要执行任何操作。根据文档,如果未找到您“搜索”的值,则会引发该异常。因此,我在这里使用它来表示:“如果我的引脚存在,请获取它们的索引;如果不存在,则不执行任何操作”。 - Jamie Poole
3
当你捕获目标异常并且异常表示一种预期的状态而不是错误时,没有必要像在 ifelse: 中一样打印或记录它。except: pass(或稍微好点的 except Exception: pass)是不可取的,如果 try 块很大并且可能以多种方式引发 ValueError,则 except ValueError: pass 也会有问题,但这种情况下使用是可以的。 - ShadowRanger
1
你应该使用Python字典。https://www.w3schools.com/python/python_dictionaries.asp 只有在必要时才使用异常处理,且仅用于异常处理。 - Gabor Szita
显示剩余6条评论
2个回答

2

使用 dict 首先更加高效(查找时间为 O(1),而不是列表的 list.indexO(n)),并且通过 get() 方法减少了对 try/except 的需求。问题在于,字典的键需要可哈希 - 而列表是不可哈希的。因此,您需要将它们转换为元组(可哈希的类型):

buttons = {
    (PIN_5,): 1,
    (PIN_5, PIN_6): 2,
    (PIN_6,): 3,
    (PIN_6, PIN_19): 4
}

现在可以使用get方法检查一个键,如果没有找到,则会返回第二个default参数:

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

请注意,这是“顺序敏感”的——也就是说,[PIN_6,PIN_5]将返回0而不是2

1

不需要。首先,每当您需要根据键检索值时,只需使用字典:

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)

谢谢!感谢您的帮助和解释 :) - Jamie Poole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接