Python中使用語句匯入模組或包的機制研究
這篇文章討論了Python的from import *和from import *,它們怎麼執行以及為什麼使用這種語法(也許)是一個壞主意。
從一個模組匯入全部
from import * means意味著“我希望能訪問中我有許可權訪問的全部名稱”。例如以下程式碼something.py:
# something.py
public_variable = 42
_private_variable = 141
def public_function():
print("I'm a public function! yay!")
def _private_function():
print("Ain't nobody accessing me from another module...usually")
class PublicClass(object):
pass
class _WeirdClass(object):
pass
在Python直譯器中,我們可以執行from something import *,然後看到如下的內容:
>>> from something import *
>>> public_variable
42
>>> _private_variable
...
NameError: name '_private_variable' is not defined
>>> public_function()
"I'm a public function! yay!"
>>> _private_function()
...
NameError: name '_private_function' is not defined
>>> c = PublicClass()
>>> c
>>> c = _WeirdClass()
...
NameError: name '_WeirdClass' is not defined
from something import *從something中匯入了除了以_開頭名稱外的其他所有名稱,按照規範,_開始的名稱是私有的所以未被匯入。
嗯,不是特別糟!還有什麼?
上面沒提到__all__是什麼。all__是一個字串列表,指定了當from import *被使用時,模組(或者如後文會提到的包)中的哪些符號會被匯出。如果我們不定義__all(我們在上面的something.py就沒定義),import *預設的匯入方式是匯入除了下劃線(_)開頭的所有名稱。再說一次,程式設計慣例上下劃線表示一個符號是私有的,不匯入是合理的。讓我們來看看在something.py中定義我們自己的__all__會發生什麼。
# something.py
__all__ = ['_private_variable', 'PublicClass']
# The rest is the same as before
public_variable = 42
_private_variable = 141
def public_function():
print("I'm a public function! yay!")
def _private_function():
print("Ain't nobody accessing me from another module...usually")
class PublicClass(object):
pass
class _WeirdClass(object):
pass 鄭州做人流手術
現在,我們期望from something import *只會匯入_private_variable和PublicClass:
>>> from something import *
>>> public_variable
42
>>> _private_variable
...
NameError: name '_private_variable' is not defined
>>> public_function()
"I'm a public function! yay!"
>>> _private_function()
...
NameError: name '_private_function' is not defined
>>> c = PublicClass()
>>> c
>>> c = _WeirdClass()
...
NameError: name '_WeirdClass' is not defined
包是怎樣的呢?
當從一個包中匯入全部時,__all__的做法和模組基本一樣,不過它處理的是包中的模組(而不是把模組中的名都匯入)。所以當我們使用from import *.時__all__說明了所有需要被匯入當前名稱空間的模組。
不同之處在於,如果你在一個包的__init__.py裡面沒有宣告__all__,from import *語句不會匯入任何東西(這個說法也不全對,正確的說法在此)
但是,這有什麼不好?
寫到這裡,給大家推薦一個資源很全的python學習聚集地,點選進入,這裡有資深程式設計師分享以前學習
心得,學習筆記,還有一線企業的工作經驗,且給大家精心整理一份python零基礎到專案實戰的資料,
每天給大家講解python最新的技術,前景,學習需要留言的小細節
from import * 是不明確的。它沒告訴我們我們正在匯入什麼或者我們把什麼帶入當前名稱空間了。更好的做法是顯式地匯入我們需要的全部名稱。這種方式下,讀者(非常可能是未來的你自己)就不會困惑於你程式碼中使用的一個變數/方法/類/其他東西是哪兒來的,這也告訴了我們下一點:
可讀性很重要
即使你需要匯入很多東西,一個一個顯式地匯入也更清楚。使用PEP 328:
from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
LEFT, DISABLED, NORMAL, RIDGE, END)
你現在就能明確知道你的名稱空間裡有什麼,使用ctrl+f能很快地告訴你它們是哪兒來的。
同時,你還總是要承擔模組/包作者更改list內容(加/減東西)的風險。也就是下面兩者之一:
作者從__all__裡刪除了一個字串。如果你的程式碼使用了那個名字,你的程式碼就會報出NameError的錯誤,並且很難發現為什麼。
作者在__all__里加入了很多東西。你也許不需要這些增加的內容,所以你只是讓這些你不關心的東西佔滿了你的名稱空間。他們甚至在你不注意的時候會替代其他同名內容。
當然,有時候從模組或者包中匯入全部內容是有用的。不過,這麼做之前三思。從我的經驗來看,這麼做通常只是因為懶。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2678467/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python中匯入模組或包語句Python
- SQL語句匯入匯出大全SQL
- Oracle - 匯入匯出常用操作語句Oracle
- Python 模組匯入方式Python
- python之匯入模組的方法Python
- Python中匯入模組中的物件常見的三種方式!Python物件
- go 語言模組匯入importGoImport
- python中如何新增模組匯入路徑?Python
- Python包的匯入說明Python
- python進階(28)import匯入機制原理PythonImport
- 淺談python模組的匯入操作Python
- Golang- import 匯入包的語法GolangImport
- ABP - 模組載入機制
- python包匯入細節Python
- jar包中匯入新的類JAR
- Python匯入包的注意事項Python
- flashback log的寫入機制研究
- MySQL 5.5使用LOAD DATA INFILE語句匯入資料MySql
- 使用dubbo需要匯入的jar包JAR
- python大型專案開發規範_學習Python模組匯入機制與大型專案的規範Python
- python如何匯入自定義模組Python
- Golang-import匯入包語法GolangImport
- sql 中的with 語句使用SQL
- 用SQL語句匯入excel資料SQLExcel
- 【SQL】Oracle BLOB 批量匯入匯出圖片語句SQLOracle
- Node.js常用模組Module的載入機制與使用Node.js
- python中try..except語句如何使用?Python
- Python使用os模組、Try語句、pathlib模組判斷檔案是否存在Python
- VSCode中解決python模組匯入問題VSCodePython
- Python之外掛模式(使用import_module匯入子模組)Python模式Import
- oracle監控資料泵匯入和匯出的sql語句OracleSQL
- 使用struts,必需要匯入的jar包JAR
- javascript中的匯出和匯入實現模組化管理JavaScript
- python3匯入paramiko模組Python
- php中return語句的使用PHP
- MySQL中explain語句的使用MySqlAI
- python的with語句怎麼使用Python
- Python 迴圈語句的使用Python