python中 from . import ×××的那個點是表示當前包嗎?

在看requests源碼時看到api模塊第一句是from . import sessions,是不是導入當前包的模塊?不懂什麼意思,沒百度到。新手,請大神們指教,謝謝


我的理解是 from . import XXX默認的就是在當前程序所在文件夾里__init__.py程序中導入XXX,如果當前程序所在文件夾里沒有__init__.py文件的話,就不能這樣寫,而應該寫成from .A import XXX,A是指當前文件夾下你想導入的函數(或者其他的)的python程序名,如果你想導入的函數不在當前文件夾,那麼就有可能用到 from .. import XXX(即上一個文件夾中的__init__.py),或者from ..A import XXX(即上一個文件夾中的文件A)


當前目錄下,而且要在當前目錄下建立__init__.py文件。但是from … import的這種做法很有可能會撞上命名重複的bug,所以如果發現此類問題,可以使用from … import … as …來給類或者函數重命名。


我剛好也遇到這個問題,剛搞懂。

from . import XXX 這裡 「 . 」 的意思是你sessions當前文件夾里的初始化文件也就是sessions所在的目錄下的__init__.py文件。而這裡面也是你sessions註冊的地方。你可以打開文件目錄看一下。

" . "的意思有點類似命令行裡面,cd ..是返回上一層目錄的意思,同樣,from .. import XXX就是從上級目錄裡面導入XXX


還是那句話,凡是遇到不懂的隨時查文檔。。。。。。。。。。。。。。。。。。

在python文檔中

the Python Tutorial&>&>

6.Moudles&>&>

6.4.2. Intra-package References

章節的最末尾有闡述

上圖


sound/ Top-level package
__init__.py Initialize the sound package
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py

effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py

filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py

You can also write relative imports, with the from module import name form of import statement. These imports use leading dots to indicate the current and parent packages involved in the relative import. From the surround module for example, you might use:

from . import echo
from .. import formats
from ..filters import equalizer


例如:在模塊A.B.C中的代碼:

from . import D # 導入A.B.D
from .. import E # 導入A.E
from ..F import G # 導入A.F.G,.. 和 F是連著的,中間沒有空格

.代表當前目錄,..代表上一層目錄,...代表上上層目錄。

詳解Python中的from..import絕對導入語句_python_腳本之家


 客戶端可以執行import或from語句。如果模塊還沒有載入,這兩個語句會去搜索、編譯以及執行模塊文件程序。主要差別在於,import會讀取整個模塊,所以必須進行定義後才能讀取它的變數名;from將獲取(或者是複製)模塊特定的變數名。

  import使一個變數名引用整個模塊對象,因此必須通過模塊名稱來得到該模塊的屬性(例如,module1.printer)。而from會把變數名複製到另一個作用域,所以它就可以直接在腳本中使用複製後的變數名,而不用通過模塊(例如,printer)。

  from語句有破壞命名空間的潛質。如果使用from導入變數,而那些變數碰巧和作用域中現有變數重名,變數就會被悄悄的覆蓋掉。使用import語句時就不存在這種問題,因為必須通過模塊名才能獲取其內容。不過,使用from時,只要你了解並預料到可能發生這種事,在實際情況下這就不是一個大問題了,尤其是當你明確列出導入變數名時(例如,from module import x, y, z)。

  另一方面,和reload調用同時使用時,from語句有比較嚴重的問題,因為導入的變數名可能引用之前版本的對象。再者,from module import *形式的確可能破壞命名空間,讓變數名難以理解,尤其是在導入一個以上的文件時。

  比較務實的建議是:簡單的模塊一般傾向於使用import,而不是from。多數的from語句是用於明確列舉想要的變數,而且限制在每個文件中只用一次from *形式。這樣一來,任何無定義的變數名都可以認為是存在於from *所引用的模塊內。當你必須使用兩個不同模塊內定義的相同變數名變數時,才真的必須使用import,這種情況下不能使用from。


可以查閱下相對導入的內容,不過我是很不推薦這麼用,相對導入只是為了防止包內的名稱和系統的名稱衝突,命名上盡量避免就好。


舉個例子,

import requests

s=request.session

#######

from requests import session

s=session

可以理解為部分導入和全部導入(瞎說的,便於理解~)


下面是 from module import
的基本語法:

from UserDict import UserDict

它與你所熟知的 import module
語法很相似,但是有一個重要的區別:UserDict
被直接導入到局部名字空間去了,所以它可以直接使用,而不需要加上模塊名的限定。你可以導入獨立的項或使用 from module import * 來導入所有東西。

Dive Into Python

類比的話,和java的:

import static java.lang.System.*;

有點像。


推薦閱讀:

python3.5可以安裝Twisted嗎?
windows系統下,首行# !/usr/bin/env python是不是沒有用?
C 語言和 Python,該從哪個入門編程?
那種編程語言比較適合新手?
python多線程下載,進度條顯示問題如何解決?

TAG:Python | Python入門 |