Python 修改对象或返回修改副本的函数命名规范

7 投票
4 回答
2109 浏览
提问于 2025-04-17 06:45

在Python中,对于那些可以返回修改后的对象或者只是修改实例的函数,应该怎么命名呢?

假设你想同时实现这两种功能,那么你应该怎么给这些函数命名呢?

举个例子:假设你想为一个图像对象创建一个 crop() 函数。在Ruby中,这个命名规则很简单,如果你返回的是一个副本,就用 crop(),如果你修改的是原始实例,就用 crop!()

4 个回答

2

我知道的范围内,Python没有统一的规定。不过,我参与的一个项目有个约定,可能对你有帮助:如果一个函数可以直接修改它的参数,它会有一个叫做copy的参数,用来决定这个函数是对输入的副本进行操作,还是直接在原始数据上修改,默认值是True

def crop(x, copy=True):
    if copy:
        x = x.copy()
    _do_inplace_crop(x)
    return x
2

在标准库里,有一些方法,比如 list.sort()list.reverse(),它们会直接修改原来的列表。而像 sorted()reversed() 这样的函数则会返回一个新的东西(reversed() 返回的是一个迭代器,而不是新的列表)。不过,如果用实例方法比用函数更合适,我不会为了遵循这个规则而不这样做。

在NumPy中,很多函数和方法都有一个 out 关键字参数,这个参数可以让你指定输出结果放到一个已经存在的数组里,而不是创建一个新的数组。你甚至可以把 out 数组设置成输入数组之一。

6

我不太确定有没有具体的指导原则在某些PEP文档里,但根据我对Python核心中某些函数/方法的观察,我个人喜欢用动词变形来命名。比如,受到以下内容的启发:

>>> l = list('hello world')
>>> l
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> sorted(l)
[' ', 'd', 'e', 'h', 'l', 'l', 'l', 'o', 'o', 'r', 'w']
>>> l
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> l.sort()
>>> l
[' ', 'd', 'e', 'h', 'l', 'l', 'l', 'o', 'o', 'r', 'w']

我会把你的函数命名为 crop() [在原地修改对象] 和 cropped() [返回一个修改后的副本]。

编辑:我不懂Ruby,但在Python中,这两者之间的区别纯粹是约定俗成的(函数/方法的行为和你如何调用它是无关的)。

希望这对你有帮助!

撰写回答