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

9
大多数函数都很容易命名。通常,函数名称基于其执行的操作或产生的结果类型。
然而,在生成器函数的情况下,结果可能是另一种类型的可迭代对象。
def sometype( iterable ):
    for x in iterable:
        yield some_transformation( x )
< p > sometype 这个名称让人感到误导,因为该函数不返回命名类型的对象。实际上,它是 sometype 上的可迭代对象。

iter_sometypegen_sometype 这样的名称有点像 匈牙利命名法。然而,它似乎也澄清了函数的意图。

进一步地,有许多更专业的情况,其中前缀可能会有所帮助。这些都是典型的例子,其中一些在 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_是否有助于澄清生成器函数的名称?还是只是视觉上的杂乱无章?

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

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


我认为你有点过于概括了..我的意思是,大多数人会直接将第二个和第三个函数写成生成器表达式,比如(some_mapping(x) for x in iterable)。第一个函数并没有真正地reduce任何东西,它更像是一种映射,因为每个x都有一个新的sometype - Jochen Ritzel
1
@THC4k:请想象它们更加复杂。太复杂了,无法轻松地适应“itertools”。但不会太复杂以至于违反基本的函数式编程原则。例如,它们可能涉及大量的预备工作作为优化。 - S.Lott
1个回答

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的类,这样方法名称可以缩短为reducemapfilter,这就是有意义的。
如果这些函数可以推广到接受或返回除了sometype之外的其他类型,那么当然应该从函数名称中移除sometype,并选择强调其功能而非类型的名称。

我认为值得注意的是,在Python 3中,所有字典的iter*方法都被删除了。例如,iteritems()已经不存在了,而类的items()方法现在执行了它的功能 - 这可能表明使用前缀不被核心语言开发人员认为是“Pythonic”的,或者这样做是为了使现有代码默认以可迭代的方式执行。 - martineau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接