今天偶然发现,认为这可能值得讨论.
用于从列表中获取单个项目的Python习惯用法
它有时会发生在我有一个列表的代码中,让我们调用它
stuff,我肯定知道这个列表只包含一个项目.我想得到这个项目并把它放在一个变量中,称之为它.最好的方法是什么?在过去我曾经这样做过:Run Code Online (Sandbox Code Playgroud)thing = stuff[0]但我认为这不是最好的习语.我想出了一个更好的一个:
Run Code Online (Sandbox Code Playgroud)(thing,) = stuff为什么这个更好?
可读性:它让读者知道东西只有一个元素.
自由断言:它使得Python断言
stuff只有一个元素,所以如果我错误地在我的原始假设中stuff只有一个元素,那么Python会对我大喊大叫,然后它会在程序中的其他位置显示为一个难以发现的错误.很难错过:前面的方法最后有一个
[0].现在,这很容易在一条线上注意到thing = stuff[0].但如果这条线路像这样凌乱的话会怎么样:Run Code Online (Sandbox Code Playgroud)thing = some_dict[my_object.get_foobar_handler()][0]在这种情况下,最后的[0]很容易遗漏,因为当随便看一下代码时,它似乎可能连接到该函数调用或dict查找.因此,读者可能会错过这样一个事实,即我们从列表中取出一个项目.在这种情况下,这会更好:
Run Code Online (Sandbox Code Playgroud)(thing,) = some_dict[my_object.get_foobar_handler()]任何"集合"的常规(指向Ulrik的道具,注意到这一点):即使东西是集合或任何其他类型的集合,此方法也有效.
stuff[0]不会对集合起作用,因为set不支持按索引号访问.玩得开心!
(http://blog.garlicsim.org/post/1198230058/python-idiom-for-taking-the-single-item-from-a-list)
总的来说,我对这个想法很不满意.他对自由断言和增加的可读性做出了令人信服的论证(如果它成为一种模式).另一方面,直到/如果它变得流行,它有点难以阅读.
社区的想法是什么?
博客海报希望单个语句起到(1)从列表中提取项目,(2)断言,以及(3)作为评论告知用户该列表仅具有一个项目的作用.
我非常喜欢尽量减少代码行数,但我非常喜欢以下内容:
assert len(stuff) == 1, "stuff should have length 1 but has length %d" % len(stuff)
thing = stuff[0]
Run Code Online (Sandbox Code Playgroud)
显式优于隐式.
| 归档时间: |
|
| 查看次数: |
276 次 |
| 最近记录: |