有趣的Python成语,用于删除单个条目列表中的唯一项目

bab*_*itt 3 python

今天偶然发现,认为这可能值得讨论.

用于从列表中获取单个项目的Python习惯用法

它有时会发生在我有一个列表的代码中,让我们调用它stuff,我肯定知道这个列表只包含一个项目.我想得到这个项目并把它放在一个变量中,称之为它.最好的方法是什么?在过去我曾经这样做过:

thing = stuff[0]
Run Code Online (Sandbox Code Playgroud)

但我认为这不是最好的习语.我想出了一个更好的一个:

(thing,) = stuff
Run Code Online (Sandbox Code Playgroud)

为什么这个更好?

可读性:它让读者知道东西只有一个元素.

自由断言:它使得Python断言stuff只有一个元素,所以如果我错误地在我的原始假设中stuff只有一个元素,那么Python会对我大喊大叫,然后它会在程序中的其他位置显示为一个难以发现的错误.

很难错过:前面的方法最后有一个[0].现在,这很容易在一条线上注意到thing = stuff[0].但如果这条线路像这样凌乱的话会怎么样:

thing = some_dict[my_object.get_foobar_handler()][0]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,最后的[0]很容易遗漏,因为当随便看一下代码时,它似乎可能连接到该函数调用或dict查找.因此,读者可能会错过这样一个事实,即我们从列表中取出一个项目.在这种情况下,这会更好:

(thing,) = some_dict[my_object.get_foobar_handler()]
Run Code Online (Sandbox Code Playgroud)

任何"集合"的常规(指向Ulrik的道具,注意到这一点):即使东西是集合或任何其他类型的集合,此方法也有效.stuff[0] 不会对集合起作用,因为set不支持按索引号访问.玩得开心!

(http://blog.garlicsim.org/post/1198230058/python-idiom-for-taking-the-single-item-from-a-list)

总的来说,我对这个想法很不满意.他对自由断言和增加的可读性做出了令人信服的论证(如果它成为一种模式).另一方面,直到/如果它变得流行,它有点难以阅读.

社区的想法是什么?

gae*_*fan 7

博客海报希望单个语句起到(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)

显式优于隐式.