对于可返回修改对象或仅修改实例的函数,Python中的命名约定是什么?修改对象或返回修改副本的函数的Python命名约定
让我们假设你想实现这两个,你应该如何命名这些函数?
示例:我们假设您想要一个Image对象的crop()
函数。我Ruby很简单,因为如果您修改原始实例,则应使用crop()
;如果返回副本,则使用crop!()
。
对于可返回修改对象或仅修改实例的函数,Python中的命名约定是什么?修改对象或返回修改副本的函数的Python命名约定
让我们假设你想实现这两个,你应该如何命名这些函数?
示例:我们假设您想要一个Image对象的crop()
函数。我Ruby很简单,因为如果您修改原始实例,则应使用crop()
;如果返回副本,则使用crop!()
。
不确定在某些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()
[返回修改后的副本。我不知道红宝石,但在Python中,两者之间的区别纯粹是传统的(函数/方法行为与你如何调用它无关)。
HTH!
这个AFAIK没有“Python范围”的约定。但是,我所处理的项目有一个惯例可能对您有用:如果某个函数可以在原地修改其参数,则它具有一个确定它是否在其输入副本上运行的默认值,默认值为True
。
def crop(x, copy=True):
if copy:
x = x.copy()
_do_inplace_crop(x)
return x
在标准库中,有像list.sort()
和list.reverse()
方法,其修改list
到位,功能类似于sorted()
和reversed()
它会返回一些新的东西(reversed()
返回一个迭代器,而不是一个新的列表)。但是如果让一个实例方法比一个函数更有意义,我不会这么做只是为了保持这个约定。
在NumPy中,许多函数和方法都有一个out
关键字参数,它允许您指定输出应该转到现有的数组而不是创建一个新的数组。您甚至可以将out
数组作为输入数组之一。
如果我想要的东西要到位修改,我会写一个方法:
smth.crop()
如果我想它返回一个修改的对象,然后我会用一个函数:
crop(smth)
这样你可以保持函数风格(无副作用)和OOP风格的方法(带有副作用)。
但是,我还希望Python允许!
和?
字符的函数名称,如Ruby和Lisp。
对于'?',谓词有一个通用的约定 - 在函数名的开头使用'is'。 –
有时也有'has_'。 – Halst