<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 問題 你可能有大量的代碼,由不同的人來分散地維護。每個部分被組織為文件目錄,如一個包。然而,你希望能用共同的包前綴將所有組件連接起來,不是將每一個部分作為獨立的包來安裝。 ## 解決方案 從本質上講,你要定義一個頂級Python包,作為一個大集合分開維護子包的命名空間。這個問題經常出現在大的應用框架中,框架開發者希望鼓勵用戶發布插件或附加包。 在統一不同的目錄里統一相同的命名空間,但是要刪去用來將組件聯合起來的__init__.py文件。假設你有Python代碼的兩個不同的目錄如下: ~~~ foo-package/ spam/ blah.py bar-package/ spam/ grok.py ~~~ 在這2個目錄里,都有著共同的命名空間spam。在任何一個目錄里都沒有__init__.py文件。 讓我們看看,如果將foo-package和bar-package都加到python模塊路徑并嘗試導入會發生什么 ~~~ >>> import sys >>> sys.path.extend(['foo-package', 'bar-package']) >>> import spam.blah >>> import spam.grok >>> ~~~ 兩個不同的包目錄被合并到一起,你可以導入spam.blah和spam.grok,并且它們能夠工作。 ## 討論 在這里工作的機制被稱為“包命名空間”的一個特征。從本質上講,包命名空間是一種特殊的封裝設計,為合并不同的目錄的代碼到一個共同的命名空間。對于大的框架,這可能是有用的,因為它允許一個框架的部分被單獨地安裝下載。它也使人們能夠輕松地為這樣的框架編寫第三方附加組件和其他擴展。 包命名空間的關鍵是確保頂級目錄中沒有__init__.py文件來作為共同的命名空間。缺失__init__.py文件使得在導入包的時候會發生有趣的事情:這并沒有產生錯誤,解釋器創建了一個由所有包含匹配包名的目錄組成的列表。特殊的包命名空間模塊被創建,只讀的目錄列表副本被存儲在其__path__變量中。 舉個例子: ~~~ >>> import spam >>> spam.__path__ _NamespacePath(['foo-package/spam', 'bar-package/spam']) >>> ~~~ 在定位包的子組件時,目錄__path__將被用到(例如, 當導入spam.grok或者spam.blah的時候). 包命名空間的一個重要特點是任何人都可以用自己的代碼來擴展命名空間。舉個例子,假設你自己的代碼目錄像這樣: ~~~ my-package/ spam/ custom.py ~~~ 如果你將你的代碼目錄和其他包一起添加到sys.path,這將無縫地合并到別的spam包目錄中: ~~~ >>> import spam.custom >>> import spam.grok >>> import spam.blah >>> ~~~ 一個包是否被作為一個包命名空間的主要方法是檢查其__file__屬性。如果沒有,那包是個命名空間。這也可以由其字符表現形式中的“namespace”這個詞體現出來。 ~~~ >>> spam.__file__ Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'module' object has no attribute '__file__' >>> spam <module 'spam' (namespace)> >>> ~~~ 更多的包命名空間信息可以查看?[PEP 420](https://www.python.org/dev/peps/pep-0420/).
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看