Python 返回生成器的函数的名称
如何命名返回生成器的函数(即使用Python 返回生成器的函数的名称,python,naming-conventions,Python,Naming Conventions,如何命名返回生成器的函数(即使用yield foo而不是return foo) 它肯定不是getFoo(),因为它不返回Foo值 它可能不是foos(),因为我希望有一个易于识别的前缀 它可能不完全是listFoo(),因为它不返回list 它可能不是iterateFoo(),因为这个前缀太长了 你的首选解决方案是什么 更新: 虽然在某些情况下,foos()可能是一个非常好的解决方案,但请注意方法名称往往以动词开头。动词表示这是一个方法,而不是一个数据字段,因此有助于可读性。如果可能的话,我
yield foo
而不是return foo
)
- 它肯定不是
,因为它不返回Foo值getFoo()
- 它可能不是
,因为我希望有一个易于识别的前缀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
不是很清楚?我在这一点上支持@delnanfoos
听起来不错。如何命名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是一个空序列
。整体行为(一个似乎无缘无故变为空的“列表”)是奇怪的,因此很难得到