9

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

然而,在生成器函数的情况下,结果可能是对其他类型的可迭代。

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

这个sometype名字让人觉得有误导性,因为函数不返回指定类型的对象。这真的是一个可迭代的 over 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_有助于澄清生成器函数的名称?还是只是视觉上的混乱?

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

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

4

1 回答 1

7

Pythondictsiter*方法。而lxml树也有iter方法。阅读

for node in doc.iter():

似乎很熟悉,所以按照这种模式,我会考虑命名 sometypes 的生成器,sometypes_iter 以便我可以类似地编写,

for item in sometypes_iter():

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

sometypes_reduced
sometypes_mapped
sometypes_filtered

如果您有足够的这些函数,那么创建一个SomeTypes类可能会有意义,以便方法名称可以缩短为reducemapfilter

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

于 2010-11-18T15:12:54.157 回答