2014-01-11 79 views
2

使用默認:如何考慮下面的函數以正確的方式

def httpstatus(self, url, data=None, timeout=None): 
    if timeout is None: 
     timeout = socket._GLOBAL_DEFAULT_TIMEOUT 
    urlopen(url, data, timeout) 

超時參數應該是可選的。但如果ommited我想使用代碼中顯示的socket._GLOBAL_DEFAULT_TIMEOUT值。但是,那個人是受保護的成員。而這看起來並不正確。所以不同的方法......

def httpstatus(self, url, data=None, timeout=None): 
    if timeout is None: 
     urlopen(url, data) 
    else: 
     urlopen(url, data, timeout) 

廢話,一個是更髒......

什麼是回落到插座默認超時正確和恰當的方式?

+0

如果你包裝'urllib2.urlopen',你爲什麼不只是使用'* args'和'** kwargs':'高清則httpStatus(個體經營,* ARGS,** kwargs) '? – Blender

+0

@Blender我相信他不只是把它包裝起來,這只是一個簡單的例子... – kirelagin

+0

@blender,現在我只是包裝,但我更好奇的是一種更好的方法。也許我不應該尋找一個通用的方法。 – Paul

回答

1

可以使用**-syntax爲:

def httpstatus(self, url, data=None, timeout=None): 
    kwargs = {} 
    if timeout is not None: 
     kwargs['timeout'] = timeout 
    urlopen(url, data, **kwargs) 

甚至:

def httpstatus(self, url, data=None, **kwargs): 
    # Don't forget to mention in documentation that all 
    # extra arguments are passed to urlopen as is. 
    urlopen(url, data, **kwargs) 
+0

您寫的第一個變體在我看來似乎不那麼明顯,不太可讀,更可能出錯,並且通常比OP提交的最終版本更差。第二個版本也不是很好,因爲httpstatus()的調用者不需要知道它的實現是什麼,具體來說,調用者可以,如果他願意,可以添加urlopen()參數(他怎麼知道的,在Python源代碼中缺乏文檔?) – jarmod

+0

@jamond那麼,你是部分正確的:你提到的第二個版本的問題確實存在。但是它在Python中很常見,只是在您的文檔中提到所有額外的參數都傳遞給某個庫函數。 – kirelagin

+0

@jarmod,你能解釋一下:調用者可以添加urlopen()參數...我已經閱讀了5次,但仍然缺少這一點。 – Paul

1

如果你真的不想使用受保護的變種,只是把數量從插座和評論從何處得到它:

# settings 
default_timeout = 100 # socket._GLOBAL_DEFAULT_TIMEOUT 

另一種選擇是使用getattr與默認值:

default_timeout = getattr(socket, '_GLOBAL_DEFAULT_TIMEOUT', 100) 

def httpstatus(self, url, data=None, timeout=default_timeout): 
    urlopen(url, data, timeout) 
+2

使用受保護的成員似乎很奇怪,或者在Python中並不罕見? – Paul

+0

@保羅你想要使用它......所以在哪裏使用它並不重要,我認爲。您可以使某些模塊/類選項等於此受保護的套接字變量,並在函數定義中使用您的本地變量。 – ndpu

+1

是的,你有一個有效的點,我確實想要使用它。此外,該缺省值不會遠離套接字庫以及urlopen的參數序列。 – Paul

相關問題