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

时间:2010-09-28 12:51:02

标签: python

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

  

用于获取单曲的Python习语   列表中的项目

     

有时我会在代码中发生这种情况   有一个列表,我们称之为stuff,和   我肯定知道这份清单   只包含一个项目。而且我要   得到这个项目并把它放在一个   变量,称之为事物。什么是   最好的办法吗?在过去我   过去这样做:

thing = stuff[0]
     

但我认为这不是最好的习语。我上来了   更好的一个:

(thing,) = stuff
     

为什么这个更好?

     

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

     

Free assert :它使Python断言   stuff只有一个元素,所以   如果我原来的错了   假设stuff只有一个   元素,Python会对我大喊大叫   在此之前表现为一个   在其他地方难以找到的bug   程序。

     

很难错过:上一个   方法最后有一个[0]。现在,   这很容易被注意到   简称thing = stuff[0]。但是如果   这条线是凌乱的东西   这样:

thing = some_dict[my_object.get_foobar_handler()][0]
     

在这种情况下,最后的[0]是   容易错过,因为随便   看起来似乎可以看一下代码   连接到该函数调用或   字典查找。所以读者可能会错过   事实上我们正在拿出一件物品   列表在这里。这会更好   在这种情况下:

(thing,) = some_dict[my_object.get_foobar_handler()]
     

任何“集合”的常规(道具来自   Ulrik注意到这一点):这种方法   即使东西是一组或任何东西,它也可以工作   其他类型的收藏品。 stuff[0]   因为集合不会对集合起作用   不支持索引访问   数。玩得开心!

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

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

社区的想法是什么?

3 个答案:

答案 0 :(得分:7)

博客海报希望单个语句起到以下作用:(1)从列表中提取项目,(2)断言,以及(3)作为评论告诉用户该列表只有一个项目。

我非常喜欢尽量减少代码行数,但我非常喜欢以下内容:

assert len(stuff) == 1, "stuff should have length 1 but has length %d" % len(stuff)
thing = stuff[0]

明确比隐含更好。

答案 1 :(得分:2)

我更喜欢:

[thing] = stuff

只是因为我觉得(thing,)很难看。但我一般都喜欢这个概念。

答案 2 :(得分:0)

一个人可能会自己错过这个逗号,我宁愿把东西放在括号内,(和那个逗号),也可以用东西。

我想我目前有权写thing = stuff[0]