Python命名约定:指示函数是否改变参数

5
我想知道是否有一种适当的Python约定来区分那些会就地修改其参数和那些会保留其参数并返回已更改副本的函数。例如,考虑两个应用某些置换的函数。函数f接受一个列表作为参数并对元素进行洗牌,而函数g接受一个列表,复制它,应用f,然后返回更改后的副本。
对于上面的示例,我认为可以将f称为permute(x),而将g称为permutation(x),使用动词和名词来区分。但这并不总是最优的,在某些情况下,这可能会导致混淆,特别是如果f要返回其他值时,人们可能会困惑参数是否会被更改。
有没有一种标准方法来解决这个问题?
1个回答

7

目前没有方便的命名规范,至少像PEP-8这样的地方没有写下来。

Python标准库在一定程度上确实使用了这种约定。比较一下:

listobj.sort()
listobj.reverse()

使用

sorted_listobj = sorted(listobj)
reversed_iterator = reversed(listobj)

当直接作用于对象时使用动词,当返回新对象时使用形容词。

这种惯例并不一致。当枚举一个可迭代对象时,使用enumerate()而不是enumerated()filter()不会就地修改输入序列。 round()不会影响输入数字对象。 compile()生成一个新的字节码对象。等等。但是在Python标准库中没有任何操作具有就地替换的等效操作,我也不知道任何在输入被就地修改的情况下使用形容词的用法。


list.reversereversed - Stefan Pochmann
是的,排序是一个想法,但这需要一种基于对象的方法,这并不总是适用的。顺便说一下,“sorted”是形容词,而不是名词;-) - Joost
@Joost: 耸肩, 外语语法,我是一名软件工程师,而不是语言学家。 :-P (但是是的,已经改正了)。在这里,listobj.sort()是一个方法并不重要;相同的规则也适用于sort(listobj)sorted(listobj) - Martijn Pieters
啊,你说得对。那个方法非常好用。我的例子会变成permute(x)permuted(x),这很清晰明了。 - Joost

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