2013-07-16 27 views
1

我想通過查看流行庫中的代碼來了解關於Python的更多信息。我碰到的第一個圖書館是Kenneth Reitz的python-requestslogging.NullHandler和__init__.py在Python請求中的文件位置

我所做的只是git clone <request_repo_url_from_github>,現在我正在檢查代碼。

我正在查看requests/packages中的__init__.py文件。

我有幾個問題想請教:

  1. 爲什麼__init__.pyrequests/packages,應該有不requests直接下__init__.py文件?或者它是簡單的,因爲這是一個從github直接克隆和卸載的軟件包,它就像這樣?

  2. 第二個問題涉及上面的代碼如下。我想知道的是NullHandler究竟做了什麼?我看了一下文檔here,這是什麼意思,有一個'無操作'處理程序。這個Handler將被圖書館開發人員用在哪裏?我的意思是,它有什麼特別之處?


import logging 
try: # Python 2.7+ 
    from logging import NullHandler 
except ImportError: 
    class NullHandler(logging.Handler): 
     def emit(self, record): 
      pass 
+0

你可能會對['logging_tree'](http://rhodesmill.org/brandon/2012/logging_tree/)感興趣,它以樹形圖的形式顯示所有記錄器。 –

回答

1
  1. 有一個__init__.py文件在目錄中打開該目錄爲Python包。它不是而是也將子目錄轉換爲包。如果你看一下源代碼樹,你會看到它看起來像這樣(與非相關的,文件中刪除)

    requests/ 
    | 
    |-- __init__.py 
    |-- packages/ 
        | 
        |-- __init__.py 
        |-- charade/ 
        | | 
        | |-- __init__.py 
        |-- urllib3/ 
         | 
         |-- __init__.py 
    

    這定義了頂級包,requests,也是子包requests.packagesrequests.packages.charaderequests.packages.urllib3 。定義這些軟件包對於使它們正確導入是必要的。

    直接回答你問的問題,有requests/直屬的__init__.py文件。整棵樹中只有一個。

  2. NullHandler什麼都不做。它已到位,因此即使用戶沒有配置任何記錄器,也可以無條件地使用對logging庫的調用。基本上,當urllib3嘗試記錄任何內容時,連接到日誌記錄庫的所有記錄器都會被調用。如果有沒有記錄器連接,則日誌記錄庫將發出警告。這些都很糟糕,所以這是一個解決方法,使庫代碼更簡單,而不會強制登錄人員。

+1

謝謝,當第二大貢獻者回答你對他們貢獻的圖書館的問題時,它很棒。非常感謝,圖表很有意義。但是,它與它在桌面上克隆時的外觀不同。順便說一下,它的鐵八爪貓給你了! :P –

+0

很高興爲您服務!所以該圖顯示了我在工作機器上籤出的基本結構,但刪除了所有非'_init __。py'文件。你的外貌如何? – Lukasa

3

從我記得requests,在packages目錄包含其他依賴此筆者決定用requests捆綁而不是添加爲依賴關係沿着鏡子。就我個人而言,我會簡單地使它們依賴,如果有必要引用特定的版本,但我相信他們有捆綁方法的理由。我無論如何,它包含了一個__init__.py這樣的代碼可以把它作爲一個模塊,做這樣的事情:

import requests.packages.urllib3 

如果你看一下requests directory on Github,你會看到確實是有一個__init__.py在該目錄太。如果你想有一個包的層次結構,你需要在每個級別上有這樣一個文件,儘管在最簡單的情況下它可能是一個空文件。

如果你不把__init__.py放在一個目錄中,Python不會將它識別爲一個包 - 這是爲了防止意外地將模塊包含在你不希望的地方。你可以想象任何一種方式,一個目錄可以被命名爲與其他地方的一個包相同的包,並且引起難以置信的混淆,但是由於其中不會有__init__.py,它將被Python忽略。

要回答第二個問題,NullHandler是出於某種原因方便使用日誌處理程序的情況,但實際上並不想執行任何日誌記錄。如果您使用的是執行日誌記錄的庫,但在您的情況下您實際上不想記錄任何內容,則可以使用此功能 - 您安裝NullHandler以將這些日誌記錄消息丟棄,因爲它比輕鬆(並且更好的練習)要比更改他們的庫以去除日誌代碼。

在這個例子中,我想你可以添加一個替代日誌記錄,並簡單地設置日誌記錄級別,以便實際上不生成消息,但是使用NullHandler代替它可能更容易。

+0

@Cartoo感謝answe,我非常感謝。 –

+0

我們爲什麼不把它們作爲依賴包含在這個封閉的問題中進行了大討論(https://github.com/kennethreitz/requests/issues/1384)。 – Lukasa

+0

我想對於圖書館來說很難 - 對於應用程序,你可以告訴人們使用virtualenv並完成它。如果可以依靠其他庫來保持API兼容性,至少在主要版本中是這樣,但是我想大多數人不會爲這種事情煩惱。從一個C++背景來看,我想我可能比一些純Python程序員更習慣於這門學科。 – Cartroo

相關問題