今天偶然发现了这个,觉得值得讨论。
Python idiom for taking the single item from a list
It sometimes happens in code that I have a list, let’s call it
stuff
, and I know for certain that this list contains exactly one item. And I want to get this item and put it in a variable, call it thing. What’s the best way to do this? In the past I used to do this:
thing = stuff[0]
But I think that’s not the best idiom. I came up with a better one:
(thing,) = stuff
Why is this one better?
Readability: It lets the reader know that stuff has exactly one element.
Free assert: It makes Python assert that
stuff
has exactly one element, so if I was wrong in my original assumption thatstuff
has exactly one element, Python will shout at me before this manifests itself as a hard-to-find bug someplace else in the program.Hard to miss: The previous method had a
[0]
at the end. Now, that’s easy to notice in a line as short asthing = stuff[0]
. But what if the line were something messy like this:
thing = some_dict[my_object.get_foobar_handler()][0]
In this case, the [0] at the end is easy to miss, because when casually glancing the code, it might seem connected to that function call or dict lookup. So the reader might miss the fact that we’re taking an item out of a list here. This would be better in this case:
(thing,) = some_dict[my_object.get_foobar_handler()]
General for any “collection” (props to Ulrik for noting this): This method works even when stuff is a set or any other kind of collection.
stuff[0]
wouldn’t work on a set because set doesn’t support access by index number. Have fun programming!
(http://blog.garlicsim.org/post/1198230058/python-idiom-for-taking-the-single-item-from-a-list)
总的来说,我对这个想法感到矛盾。他提出了一个有力的论点,即使用free assert可以增加可读性(如果成为一种模式)。另一方面,在它变得流行之前/之后,它有点难以阅读。
社区怎么看?
thing, = stuff
。 - MattH