今天偶然发现,认为这可能值得讨论。
用于获取单曲的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)
总的来说,我对这个想法很不满意。他对自由断言和增加的可读性做出了令人信服的论证(如果它成为一种模式)。另一方面,直到/如果它变得流行,它有点难以阅读。
社区的想法是什么?
答案 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]