Python 返回生成器的函数的名称

Python 返回生成器的函数的名称,python,naming-conventions,Python,Naming Conventions,如何命名返回生成器的函数(即使用yield foo而不是return foo) 它肯定不是getFoo(),因为它不返回Foo值 它可能不是foos(),因为我希望有一个易于识别的前缀 它可能不完全是listFoo(),因为它不返回list 它可能不是iterateFoo(),因为这个前缀太长了 你的首选解决方案是什么 更新: 虽然在某些情况下,foos()可能是一个非常好的解决方案,但请注意方法名称往往以动词开头。动词表示这是一个方法,而不是一个数据字段,因此有助于可读性。如果可能的话,我

如何命名返回生成器的函数(即使用
yield foo
而不是
return foo

  • 它肯定不是
    getFoo()
    ,因为它不返回Foo值
  • 它可能不是
    foos()
    ,因为我希望有一个易于识别的前缀
  • 它可能不完全是
    listFoo()
    ,因为它不返回
    list
  • 它可能不是
    iterateFoo()
    ,因为这个前缀太长了
你的首选解决方案是什么

更新:

虽然在某些情况下,
foos()
可能是一个非常好的解决方案,但请注意方法名称往往以动词开头。动词表示这是一个方法,而不是一个数据字段,因此有助于可读性。如果可能的话,我更喜欢一种能够轻松区分方法和数据字段的解决方案。

genFoo()


(…和一些额外的单词确保此解决方案至少包含30个字符)

一些简短的建议:

getFoos()
generateFoos()
yieldFoos()
allFoos()
由于通常不需要生成器来获取所有的foo,因此生成器的特定函数通常会建议一个更有趣的名称:

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

我认为
foo
foos
是可能的。或者,为了模仿Python2 dicts的iteritems,您可以使用
iterfoo

,虽然有一些有用的名称来指示函数的作用是一种很好的做法,但我认为完全没有必要使用它来指示函数的返回类型

返回类型可能应该记录在注释或docstring中,但我建议最好使用类似
foos()
getfoos()
、或
get\u foos()
的名称

如果您确实希望这是一个生成器,我建议您使用
iterfoos()
,因为它与python2的dict方法类似,比如
itervalues()


请记住,许多用于返回列表的内置函数现在都是Python3中的生成器(
map()
dict.values()
等),因此当返回序列的函数是生成器时,即使您没有调用它
generate\u foos(),也不会让任何人感到惊讶
或其他变体。

最准确的是:

iterateFoo()
iterate_foo()
iter_foo()
iterFoo()

您可以明确地说出函数的作用,同时也非常清楚为什么要使用它。

谁说前缀是件好事?怎么
foos
不是很清楚?我在这一点上支持@delnan
foos
听起来不错。如何命名iterable(例如列表)?在我的编码实践中,函数名中的下划线优先于小写。我找不到PEP中是否有规定,但Django文档中有规定:“变量、函数和方法名称(即poll.get_unique_vorters(),而不是poll.getuniquevorters())使用下划线,而不是camelCase。”。。。但软件工程的核心原则之一是数据库始终是一个傻瓜……;)Camelcase可能不被视为符合PEP8(据我所知,PEP8没有明确说明生成器)。我总是觉得在
dict.values()
中没有任何提示是一个奇怪的选择。它从不打扰我,因为我知道它会做什么,但如果有人认为它会返回一个列表,它可能会导致(很难捕获)bug。例如,如果您这样做
vals=dict.values()
,然后尝试获取最小值
min\u value=min(vals)
,一切正常,但是您需要最大值
max\u value=max(vals)
,这会产生以下错误:
ValueError:max()arg是一个空序列
。整体行为(一个似乎无缘无故变为空的“列表”)是奇怪的,因此很难得到