set.union() 在传入生成器时抱怨没有参数

6 投票
1 回答
6475 浏览
提问于 2025-04-17 14:54

这段内容来自Wes Mckinney的《Python数据分析》第204页

genre_iter = (set(x.split('|')) for x in movies.genres)
genres = sorted(set.union(*genre_iter))

这段代码在使用IPython的%paste方法时运行得非常好。在Python命令行中运行时也没有问题。不过,当我直接在IPython中输入第二行代码,而不使用%paste方法时

genres = sorted(set.union(*genre_iter))

我就会遇到以下错误

TypeError: descriptor 'union' of 'set' object needs an argument

这看起来像是个bug,除非IPython还有我不知道的某个功能。

1 个回答

14

你已经用完了这个生成器。在再次使用之前,需要重新定义它:

genre_iter = (set(x.split('|')) for x in movies.genres)
genres = sorted(set.union(*genre_iter))

在Python中,一旦你遍历完一个迭代器的所有元素,就不能再继续遍历这个迭代器了(它现在是空的)。

因为genre_iter这个迭代器已经空了,所以你没有给set.union()传递任何参数,因此它会报错:

>>> set.union()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: descriptor 'union' of 'set' object needs an argument

为了更明确一点:你并没有在ipython中发现bug。你在普通的Python命令行中也会遇到同样的问题。

撰写回答