【问题标题】:Python best practice: try except pass?Python 最佳实践:尝试除通过?
【发布时间】:2020-11-18 18:34:18
【问题描述】:

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

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

所以在我的代码中,我需要将 High 引脚映射到“按钮”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 的任何可能的泄漏/影响?

干杯, 杰米

【问题讨论】:

  • 如果在里面,则捕获错误并打印或记录错误。为什么要通过声明。 github.com/aviboy2006/flask-rest-api/blob/master/app.py 将此作为参考。
  • 你应该改用字典
  • 谢谢。我想通过,因为如果 .index() 函数引发 ValueError 异常,我不需要发生任何事情。根据文档,如果找不到您“搜索”的值,则会引发此异常。所以我在这里用它来表示,“如果它们存在,给我我的引脚的索引,如果不存在,什么都不做”
  • @aviboy2006: 当你捕捉到一个有针对性的异常并且异常表明一个预期的状态而不是错误时,没有理由打印或记录它,比你需要的更多打印/登录附加到if 的else:。 except: pass(或稍微不那么糟糕的except Exception: pass)是一个禁忌,如果try 块很大并且可以通过许多不同的方式提高ValueError,那么except ValueError: pass 将是一个问题,但是这个用例很好。
  • 你应该使用 python 字典。 w3schools.com/python/python_dictionaries.asp 仅在确实需要且仅用于异常处理时才使用异常。

标签: python python-3.x


【解决方案1】:

首先,使用dict 更有效(O(1) 的查找时间与list.index 的O(n) 相比),并且在get() 方法。 “问题” 是字典的键需要是可散列的——列表不是。因此,您需要将它们转换为元组(可散列):

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!

【讨论】:

    【解决方案2】:

    没有。 首先要注意:每当您必须检索给定键的值时,只需使用字典即可​​:

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

    看到(1)值可以是任意的,并且不需要做hacks,以便您的组合插入的rder需要匹配您需要的数值,并且(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)
    

    【讨论】:

    • 谢谢!感谢帮助和解释:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多