有趣的Python习惯用法,用于删除单个条目列表中的唯一项

有趣的Python习惯用法,用于删除单个条目列表中的唯一项,python,Python,今天偶然发现了这个,认为它可能值得讨论 Python的习惯用法 列表中的项目 有时在代码中会发生 有一个列表,我们称之为东西,然后 我确信这份名单 只包含一项。我想要 获取此项目并将其放入 变量,叫它东西。有什么问题 最好的方法是什么?过去我 用于执行此操作: thing = stuff[0] 但我认为这不是最好的成语。我上来了 有一个更好的: (thing,) = stuff 为什么这个更好 可读性:让读者知道 那东西只有一个元素 自由断言:它使Python断言 那东西只有一个元素,所以

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

Python的习惯用法 列表中的项目

有时在代码中会发生 有一个列表,我们称之为
东西
,然后 我确信这份名单 只包含一项。我想要 获取此项目并将其放入 变量,叫它东西。有什么问题 最好的方法是什么?过去我 用于执行此操作:

thing = stuff[0]
但我认为这不是最好的成语。我上来了 有一个更好的:

(thing,) = stuff
为什么这个更好

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

自由断言:它使Python断言 那东西只有一个元素,所以 如果我的原稿错了 假设
stuff
正好有一个 元素,Python会对我大喊大叫 在这表现为 在世界其他地方很难找到虫子 节目

很难错过:上一个 方法的末尾有一个
[0]
。现在, 这很容易在一行中被注意到 缩写为
thing=stuff[0]
。但是如果 这条线有点乱,就像 这:

在这种情况下,末尾的[0]是 很容易错过,因为当不经意间 浏览一下代码,可能会发现 连接到该函数调用或 dict查找。所以读者可能会错过 事实上我们要把一件东西拿出来 这里有一个列表。这样会更好 在这种情况下:

(thing,) = some_dict[my_object.get_foobar_handler()]
适用于任何“收藏”的常规 Ulrik注意到这一点):这种方法 即使东西是一套或任何一套,也能工作 其他类型的收藏<代码>素材[0] 不会在电视机上工作,因为电视机 不支持按索引访问 号码。玩得开心

()

总的来说,我对这个想法感到困惑。他用自由断言和更高的可读性(如果它成为一种模式)提出了一个令人信服的论点。另一方面,在它流行之前,阅读起来有点困难


社区是怎么想的?

博客海报希望一条语句可以起到以下作用:(1)从列表中提取一个项目,(2)断言,(3)作为一条注释,告诉用户列表中只有一个项目

我非常喜欢最小化代码行数,但我非常喜欢以下内容:

assert len(stuff) == 1, "stuff should have length 1 but has length %d" % len(stuff)
thing = stuff[0]
显式比隐式好。

我更喜欢:

[thing] = stuff

如果只是因为我觉得
(东西,)
很丑就好了。但我总的来说喜欢这个概念。

一个人很可能会忽略逗号本身,我宁愿把东西索引起来,而不是放在括号里(还有那个逗号)


我想我现在已经习惯于写
thing=stuff[0]

了,但并不意味着优点或其他,我只是想说,如果没有大括号,这也是可能的:
thing,=stuff
@Matth:但是后面的逗号(没有括号)也很容易被忽略。+1:断言通常是必要的。出人意料的经常。你可能认为你知道它有一个元素。但你在其他地方遇到了问题。
[thing] = stuff