2011-11-21 65 views
5

对于可返回修改对象或仅修改实例的函数,Python中的命名约定是什么?修改对象或返回修改副本的函数的Python命名约定

让我们假设你想实现这两个,你应该如何命名这些函数?

示例:我们假设您想要一个Image对象的crop()函数。我Ruby很简单,因为如果您修改原始实例,则应使用crop();如果返回副本,则使用crop!()

回答

5

不确定在某些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!

1

这个AFAIK没有“Python范围”的约定。但是,我所处理的项目有一个惯例可能对您有用:如果某个函数可以在原地修改其参数,则它具有一个确定它是否在其输入副本上运行的默认值,默认值为True

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

在标准库中,有像list.sort()list.reverse()方法,其修改list到位,功能类似于sorted()reversed()它会返回一些新的东西(reversed()返回一个迭代器,而不是一个新的列表)。但是如果让一个实例方法比一个函数更有意义,我不会这么做只是为了保持这个约定。

在NumPy中,许多函数和方法都有一个out关键字参数,它允许您指定输出应该转到现有的数组而不是创建一个新的数组。您甚至可以将out数组作为输入数组之一。

0

如果我想要的东西要到位修改,我会写一个方法:

smth.crop() 

如果我想它返回一个修改的对象,然后我会用一个函数:

crop(smth) 

这样你可以保持函数风格(无副作用)和OOP风格的方法(带有副作用)。

但是,我还希望Python允许!?字符的函数名称,如Ruby和Lisp。

+0

对于'?',谓词有一个通用的约定 - 在函数名的开头使用'is'。 –

+1

有时也有'has_'。 – Halst