Python生成器函数命名——前缀有用吗?

9 投票
1 回答
3094 浏览
提问于 2025-04-16 07:16

大多数函数的命名都比较简单。一般来说,函数的名字是根据它的功能或者它返回的结果类型来命名的。

不过,对于生成器函数来说,返回的结果可能是某种其他类型的可迭代对象。

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

这里的sometype这个名字让人有点误解,因为这个函数并不是返回一个这种类型的对象。实际上,它返回的是一个sometype的可迭代对象。

iter_sometype或者gen_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_这样的前缀,是否能帮助更好地理解生成器函数的名字?还是说这只是视觉上的杂乱?

如果前缀有帮助,你有什么前缀的建议吗?

另外,如果后缀有帮助,你有什么后缀的建议吗?

1 个回答

7
sometypes_reduced
sometypes_mapped
sometypes_filtered

Python中的dicts(字典)有一些以iter*开头的方法。而lxml树也有一个iter方法。

看起来seems familiar这个用法很熟悉,所以我考虑按照这个模式给某种类型的生成器命名为sometypes_iter,这样我就可以写成类似的形式:

for node in doc.iter():

Python提供了一个sorted函数。按照这个模式,我可能会把动词函数改成过去式:

for item in sometypes_iter():

如果你有足够多这样的函数,可能会考虑创建一个SomeTypes类,这样方法名称就可以简化为reducemapfilter

如果这些函数可以被泛化,接受或返回其他类型而不是sometype,那么当然可以考虑去掉sometype这个名字,改用一个更强调功能而不是类型的名称。

撰写回答