2011-11-21 73 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