返回生成器的函数名称

45 投票
5 回答
12057 浏览
提问于 2025-04-17 11:15

你怎么给一个返回生成器的函数命名呢?也就是说,这个函数用的是 yield foo 而不是 return foo

  • 肯定不能叫 getFoo(),因为它并不是返回一个具体的 Foo 值。
  • 也不太适合叫 foos(),因为我更希望有个容易区分的前缀。
  • 也不太适合叫 listFoo(),因为它并不是返回一个 list
  • 也不太适合叫 iterateFoo(),因为这个前缀太长了。

你更喜欢怎么命名呢?

更新:

虽然 foos() 在某些情况下可能是个不错的选择,但要注意,方法的名字通常是以动词开头的。动词传达了这是一个方法,而不是一个数据字段,这样有助于提高可读性。如果可以的话,我更希望有个解决方案能让人容易区分方法和数据字段。

5 个回答

13

虽然给变量和函数起个能说明它们作用的名字是个好习惯,但我觉得没必要用匈牙利命名法来表示函数的返回类型。

返回类型最好在注释或者文档字符串里说明,不过我建议用像foos()getfoos()或者get_foos()这样的名字会更好。

如果你想让人一眼就看出这是个生成器,我建议用iterfoos(),因为它和Python 2里的字典方法itervalues()很相似。

要记住,很多以前返回列表的内置函数在Python 3中现在变成了生成器,比如map()dict.values()等等。所以即使你没有把函数叫做generate_foos()或其他变体,大家也不应该对返回序列的函数是生成器感到惊讶。

20

我觉得可以用 foo 或者 foos 这两个名字。或者,如果想模仿 Python2 中字典的 iteritems,可以用 iterfoo 这个名字。

1

这里有一些简短的建议:

getFoos()
generateFoos()
yieldFoos()
allFoos()

因为你通常不需要一个生成器来获取所有的foos,所以生成器的具体功能可以让你给它起个更有趣的名字:

getActiveFoos()
getGreenFoos()
getFoosMatchingCriteria(someCriteria)
getFoosOverTheNetworkIfTheDatabaseIsntBeingAJerkface()

撰写回答