2015-10-26 38 views
1

我拼湊小,內部應用程序,以「自下而上」的方式,從我的腦袋爲之傾倒。因此,一旦我發現我正在寫作的函數,我想使它成爲一個「幫助器」函數,並防止自己在一個小時或一年內回來並編寫調用它的代碼在某種程度上,我並不打算引用它。Python函數封裝(以避免不正確的情況下意外調用)

在Java中,我可以只讓一個班,讓我的「幫手」功能私人靜態方法,並把代碼我「的意思是」從進入公共靜態方法調用它們。

什麼是Python的方式,以避免對自己的腳趾踩着如我所描述?

這裏是一個非常簡單的例子功能我不想讓自己從「隨便找個地方」致電:

(例如,也許爲可編輯我想保持需要的所有功能「 simple_salesforce」模塊併攏,但不希望暴露喜歡getAFreshContactList功能()來調用外部很好地異常處理代碼控制登錄流程,確定是否甚至需要一個新的聯繫人列表,註銷等)

from simple_salesforce import Salesforce 
def getAFreshContactList(sfSession): 
    if isinstance(sfSession, Salesforce): 
     return sfSession.query("SELECT Id, Name, Email FROM Contact LIMIT 2")['records'] 

謝謝!

+1

使用領先的下劃線使它*私人約會*?從該腳本的'__all__'輸出中排除它? – jonrsharpe

+1

「私有」的Python約定用單個前導下劃線(例如'_getAFreshContactList')命名它們。這些函數和變量不會被'dir()'或'help()'列出,也不會被'from module import *'導入(儘管你可能不應該這樣做)。 – Blckknght

回答

2

將函數添加到單獨的輔助模塊。不要使用*符號導入模塊,函數調用約定的行爲與Java靜態函數的行爲完全相同。例如:

my_helper.py:

from simple_salesforce import Salesforce 
def getAFreshContactList(sfSession): 
    if isinstance(sfSession, Salesforce): 
     return sfSession.query("SELECT Id, Name, Email FROM Contact LIMIT 2")['records'] 

my_program.py

import my_helper 
def someFunction: 
    my_helper.getAFreshContactList(None) 

實際上的Python namespaces整個點正是創建服務於不同目的的名稱之間的分隔。

而Python 約定可以讓你在前面加上一個下劃線模塊屬性,以防止它出現在文檔和星級進口,there is no such thing as truly private in Python

「私人」的實例變量不能只是從內部訪問一個對象在Python中不存在。但是,大多數Python代碼都遵循一個約定:以下劃線(例如_spam)作爲前綴的名稱應被視爲API的非公開部分(無論它是函數,方法還是數據成員) 。它應該被視爲實施細節,如有更改,恕不另行通知。

在Java中,你將不得不使用反射來調用類的私有聲明的方法,但在Python有沒有什麼能直接調用my_helper._myPrivateFunction()除了慣例阻止你。在函數或任何其他屬性前面加下劃線應該提醒您在模塊外部使用時要格外小心。

+0

謝謝,我看到它如何使它像一個靜態函數。然而,我不會得到的是使這樣的功能更像一個「私人」靜態功能。 你在我看來更像是「公共靜態函數」,我說我會暴露在Java類中,而不是「私有靜態函數」,我說我想隱藏主程序。 –

+2

我已盡力解決您的疑慮。不幸的是,Python中沒有「私有」的東西。 –

+0

好的,謝謝。絕對是我進入這種語言的最大調整! –

相關問題