對於可返回修改對象或僅修改實例的函數,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