Python生成器函数名称 - 前缀有用吗?

时间:2010-11-18 14:37:33

标签: python functional-programming generator hungarian-notation

大多数功能都很容易命名。通常,函数名称基于它的作用或它产生的结果类型。

但是,对于生成器函数,结果可能是某个其他类型的可迭代结果。

def sometype( iterable ):
    for x in iterable:
        yield some_transformation( x )

sometype名称会产生误导,因为该函数不会返回指定类型的对象。它实际上是sometype的可迭代。

iter_sometypegen_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_前缀是否有助于澄清生成器函数的名称?还是只是视觉上的混乱?

如果前缀有用,你有什么前缀建议吗?

或者,如果后缀有用,您有什么后缀建议?

1 个答案:

答案 0 :(得分:7)

Python dictsiter*种方法。 lxml树也有iter方法。 阅读

for node in doc.iter():

似乎很熟悉,所以 遵循这种模式,我会考虑命名一个类型为sometypes_iter的生成器 所以我可以有节制地写,

for item in sometypes_iter():

Python提供了sorted函数。 按照这种模式,我可能会使动词函数过去时:

sometypes_reduced
sometypes_mapped
sometypes_filtered

如果您有足够的这些功能,那么创建SomeTypes类可能是有意义的,因此方法名称可以缩短为reducemapfilter

如果函数可以被推广为接受或返回sometype以外的类型,那么当然从函数名中删除sometype是有意义的,而是选择一个强调它的名称而不是类型。