Python生成器函数命名——前缀有用吗?
大多数函数的命名都比较简单。一般来说,函数的名字是根据它的功能或者它返回的结果类型来命名的。
不过,对于生成器函数来说,返回的结果可能是某种其他类型的可迭代对象。
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
类,这样方法名称就可以简化为reduce
、map
和filter
。
如果这些函数可以被泛化,接受或返回其他类型而不是sometype
,那么当然可以考虑去掉sometype
这个名字,改用一个更强调功能而不是类型的名称。