Python import用法之2個細節

2021-10-10 04:54:04 字數 3231 閱讀 8930

# 1. 從乙個模組中匯入指定的類或者方法

form a import b

# 2. 從乙個模組中匯入全部

from a import

*

筆者之前根據這兩個知識點,從其表面意思理解, 忽略了該細節。

該細節是:第二種方式,匯入全部,是真的匯入全部(當然除了if __name__ == '__main__'裡面的東西)。而第一種方式,確不僅僅只匯入了指定的類和方法,還會執行在函式和類範圍外**

舉例說明:

有個名命為a的模組,內容如下

我們從另乙個模組中import這個模組:

忽略這個細節之前,我會認為上圖的**執行後,只會輸出:22222222222222222222222

但實際的輸出是:

所以,可以總結:

form a import b這種方式,當該語句被執行時,會執行a模組中除了類和方法以及if __name__ == '__main__'之外的所有**。

這個細節,平時可能不會引出bug,但在一些編碼風格不好的程式中,就很容易埋雷。

因此,自省以下:

記住該知識點,當不幸爆雷時,可以很快定位問題。

最好不要在乙個模組中除了類中和方法中編寫具備業務功能的**。

即`irom x import *中 * 號的作用。

可能大家都能記住的是,*號意味著將乙個包裡的所有模組全部匯入,或者是將乙個模組裡的類和函式全部匯入。

並且從程式設計風格上提倡不建議使用from x import *這種方式。

而這裡需要記錄的乙個細節是,*號意味著可以直接使用目標函式的名字,而不用加字首。

比如:

import time

time.sleep(1)

# 程式設計風格上不建議的方式

form time import

*sleep(

1)

上面這個簡單到不像話的例子,僅僅是為了說明這一點:通過*號,我們可以預先不知道time模組中有個命名為sleep的方法,當import 之後,即可以在執行時呼叫它。

總結一下:通過號,我們可以使得python在當執行時才知道方法名的一些方法得到呼叫,執行一些在執行前未知命名的方法。即呼叫程式都不知道它要呼叫的目標名字,則在編寫程式時自然無法通過具體名字來匯入。

以下示例簡單介紹了這種使用場景:

先看**目錄:

lib 是乙個包,main.py是程式執行檔案。

lib包中有個test_lib.py模組,**如下:

# lib/test_lib.py

deftest_a()

:print

("test 11111111111111111111111111111"

)def

test_b()

:print

("test 22222222222222222222222222222"

)

lib包中有個__init__.py檔案,**如下:

# lib/__init__.py

from

.test_lib import

*

因為這裡不知道test_lib中有哪些函式或者類,且需要把所有函式和類全部匯入。所以用的*號

main.py**如下:

# main.py

from lib import

*def

exec_func

(execname)

:eval

(execname)

if __name__ ==

'__main__'

: exec_func(

"test_a()"

) exec_func(

"test_b()"

)

這裡也用的*號,且只能用星號,因為執行時傳入的肯定是單純的函式名,不可能指出這個函式來自哪個模組。

執行結果如下:

test 11111111111111111111111111111

test 22222222222222222222222222222

process finished with exit code 0

如果main.py中使用from lib import test_lib,將報如下錯誤:

traceback (most recent call last)

: file "c:/users/卟知導/pycharmprojects/pythonproject/main.py"

, line 8,in

exec_func(

"test_a()"

) file "c:/users/卟知導/pycharmprojects/pythonproject/main.py"

, line 5

,in exec_func

eval

(execname)

file ""

, line 1,in

nameerror: name 'test_a'

isnot defined

**

看看from lib import test_lib 與 from lib import *的命名空間。

通過命名空間的值,當from test_lib import *時,我們可以直接使用『test_a』來呼叫test_a函式

Python import過程解析

模組 乙個.py檔案 包 乙個資料夾,裡面一定包括乙個 init py檔案,可能包括子包和模組 module.py a 1 print module.py test.py import module print module.a 執行test.py,執行結果 module.py 1結論 import...

python import模組方法

python語言中import的使用很簡單,直接使用import module name語句匯入即可。這裡我主要寫一下 import 的本質。模組 module 用來從邏輯 實現乙個功能 上組織python 變數 函式 類 本質就是 py檔案。檔案是物理上組織方式 module name.py 模組...

python import模組方法

python包含子目錄中的模組方法比較簡單,關鍵是能夠在sys.path裡面找到通向模組檔案的路徑。下面將具體介紹幾種常用情況 1 主程式與模組程式在同一目錄下 如下面程式結構 src mod1.py test1.py 若在程式test1.py中匯入模組mod1,則直接使用importmod1或fr...