大多数功能都很容易命名。通常,函数名称基于它的作用或它产生的结果类型。
但是,对于生成器函数,结果可能是某个其他类型的可迭代结果。
def sometype( iterable ):
for x in iterable:
yield some_transformation( x )
sometype
名称会产生误导,因为该函数不会返回指定类型的对象。它实际上是sometype
的可迭代。
像iter_sometype
或gen_sometype
这样的名称感觉有点像Hungarian Notation。但是,它似乎也澄清了该功能的意图。
更进一步,有一些更专业的案例,前缀可能会有所帮助。
这些是典型示例,其中一些示例可在itertools中找到。但是,我们经常必须编写一个具有一些算法复杂性的版本
类似于itertools
,但不是完美契合。
def reduce_sometype( iterable ):
summary = sometype()
for x in iterable:
if some_rule(x):
yield summary
summary= sometype()
summary.update( x )
def map_sometype( iterable ):
for x in iterable:
yield some_complex_mapping( x )
def filter_sometype( iterable ):
for x in iterable:
if some_complex_rule(x):
yield x
iter_
,map_
,reduce_
,filter_
前缀是否有助于澄清生成器函数的名称?还是只是视觉上的混乱?
如果前缀有用,你有什么前缀建议吗?
或者,如果后缀有用,您有什么后缀建议?
答案 0 :(得分:7)
Python dicts
有iter*
种方法。 lxml树也有iter
方法。
阅读
for node in doc.iter():
似乎很熟悉,所以
遵循这种模式,我会考虑命名一个类型为sometypes_iter
的生成器
所以我可以有节制地写,
for item in sometypes_iter():
Python提供了sorted
函数。
按照这种模式,我可能会使动词函数过去时:
sometypes_reduced
sometypes_mapped
sometypes_filtered
如果您有足够的这些功能,那么创建SomeTypes
类可能是有意义的,因此方法名称可以缩短为reduce
,map
和filter
。
如果函数可以被推广为接受或返回sometype
以外的类型,那么当然从函数名中删除sometype
是有意义的,而是选择一个强调它的名称而不是类型。