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

時間 2021-05-06 17:42:04

1樓:譚九鼎

反對所有回答,雖然它們沒全錯。

假設該from . import x語句存在於proj/test.py中,它會匯入同級目錄下的__init__.

py即proj/__init__.py中的x物件,如果沒有proj/__init__.py或有那個檔案但是檔案中不存在x物件,就匯入proj/x/__init__.

py,如果還沒有,就匯入proj/x.py,還沒有就報錯。

其中同級是按__name__的前一部分或 __package__ 確定的。如果用python proj/test.py執行,__name__就是__main__,__package__是None,就會報錯。

如果用python -m proj.test執行,雖然__name__還是__main__,但是__package__是proj,就能成功匯入,即使proj/__init__.py不存在也行。

2樓:海哥Allen

引自:https://

blog.csdn.net/chinaren0001/article/details/7338041包含相對路徑import 的python指令碼不能直接執行,只能作為module被引用。

原因正如手冊中描述的,所謂相對路徑其實就是相對於當前module的路徑,但如果直接執行指令碼,這個module的name就是「__main__」, 而不是module原來的name, 這樣相對路徑也就不是原來的相對路徑了,匯入就會失敗,出現錯誤「ValueError: Attempted relative import in non-package」

3樓:張小城

客戶端可以執行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。

4樓:城陵

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

5樓:超人C

舉個例子,

import requests

s=request.session

#######

from requests import sessions=session

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

python中enumerate object究竟是一種怎樣的存在形式呢?

l Ass We Can type of l is tuplee enumerate l type of e is enumerate objectforv inenumerate e type of enumerate e is enumerate object print v type of v...

Python中ASCII,Unicode,UTF 8,encode,decode這些有什麼關係?

NoOffense ASCII,UTF 8是常用的字元編碼型別,Unicode是字符集,它們跟具體某一門語言 比如Python 無關,是計算機通行的標準。字元編碼型別規定了位元組 bytes 和字元 character 是如何對應的。例如ASCII中,10進製65代字元 A UTF 8中,16進製制...

Python中實現 a and b or c in xx 這種邏輯最簡潔的方式是怎樣的?

意群 不用lambda的話,最簡單的是用all。In 1 a,b,c 1,10,5In 2 xs list range 1 6 In 6 all i inxs foriin a,b orcinxs Out 6 True ohmyfish 使用 Perl 6 中的class Junction 是很簡潔...