初始模組與軟體包
初始模組與軟體包
簡介
對於初學者來說,通常只需要一個.py原始碼檔案就可以應付各種範例的程式碼量。然而,實際的應用程式需要的程式碼量遠比範例程式要多得多,只有一個.py原始碼檔案來編寫,勢必會造成程式程式碼管理上的混亂。所以必須根據功能將程式程式碼劃分到不同的模組(Module)中編寫,對於功能相近或彼此輔助的模組,也要知道如何使用軟體包(Package)來加以管理。
模組是什麼?
每一個.py檔案就是一個模組。每個.py檔案的主檔名就是模組名稱,想要匯入模組必須使用import關鍵字來指定模組名稱。
提示
此時如果檢視到.py檔案所在的資料夾,就會出現一個__pycache__ 資料夾,當中會有.pyc檔案,這是CPython將.py檔案編譯後的位元組碼檔案。如果之後再次匯入同一個模組,檢測到原始碼檔案沒有更改過,就不會再對原始碼重頭開始進行語義和語法解析等操作,可以直接從位元組碼開始解釋,以加快解釋執行的速度。
__builtins__模組
使用模組來管理原始碼,有利於重複使用而且可以避免混亂,然而有些函式和類需要經常使用,每次使用import就顯得很麻煩,因此這類常用的函式、類就被整理在一個__builtins__的模組中,在__builtins__模組的中的函式、類可以不用通過import進行匯入而直接進行引用,例如使用的print()、input()
print(dir(__builtins__)) """ 使用dir()函式檢視__builtins__模組包括哪些函式和類 ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip'] """
PYTHONPATH
檢視Python環境變數,Python會在這些目錄下尋找要匯入的模組,如果找不到就會丟擲ModuleNotFoundError
import sys print(sys.path) """ ['D:\\dve\\project_github_pytest\\demo', 'D:\\dve\\project_github_pytest', 'D:\\dve\\ui_project', 'C:\\Users\\admin\\PycharmProjects\\flaskProject', 'C:\\Users\\admin\\Downloads\\huashiyuting-flask-master\\flask_gitee', 'D:\\Program Files\\JetBrains\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_display', 'C:\\Python38\\python38.zip', 'C:\\Python38\\DLLs', 'C:\\Python38\\lib', 'C:\\Python38', 'C:\\Users\\admin\\AppData\\Roaming\\Python\\Python38\\site-packages', 'C:\\Python38\\lib\\site-packages', 'C:\\Python38\\lib\\site-packages\\win32', 'C:\\Python38\\lib\\site-packages\\win32\\lib', 'C:\\Python38\\lib\\site-packages\\Pythonwin', 'D:\\Program Files\\JetBrains\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend'] """
設定Python環境變數後,不管現在處於哪個目錄下都可以對模組進行引入。
import sys
sys.path.append("C:\Windows")
print(sys.path)
""" 可以明顯看到"C:\Windows"目錄已經被新增到PYTHONPATH下
['D:\\dve\\project_github_pytest\\demo', 'D:\\dve\\project_github_pytest', 'D:\\dve\\ui_project', 'C:\\Users\\admin\\PycharmProjects\\flaskProject', 'C:\\Users\\admin\\Downloads\\huashiyuting-flask-master\\flask_gitee', 'D:\\Program Files\\JetBrains\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_display', 'C:\\Python38\\python38.zip', 'C:\\Python38\\DLLs', 'C:\\Python38\\lib', 'C:\\Python38', 'C:\\Users\\admin\\AppData\\Roaming\\Python\\Python38\\site-packages', 'C:\\Python38\\lib\\', 'C:\\Python38\\lib\\site-packages\\win32', 'C:\\Python38\\lib\\site-packages\\win32\\lib', 'C:\\Python38\\lib\\site-packages\\Pythonwin', 'D:\\Program Files\\JetBrains\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend', 'C:\\Windows']
"""
使用軟體包管理模組
一個程式中會有很多類彼此合作,也有可能由很多團隊共同分工來完成應用的某些功能模組,例如部門A寫了個util.py模組,部門B也寫了個util.py模組。當他們需要將模組整合時,如果將兩個檔案放在同一個lib目錄中,就會發現同名的util.py檔案彼此覆蓋的問題。
定義一個包資料夾中一定要有一個__init__.py檔案,該資料夾才會被視為一個軟體包。
使用import as 與 from import
使用軟體包管理解決了實體檔案與import模組時名稱空間的問題。然而有時軟體包名稱加上模組名稱會使得引用某個函式、類等,必須編寫冗長的前置,如果嫌麻煩可以使用import as 或者 from import來解決這個問題。
使用import as
import json as js
data = {"resultCode": "SUCCESS", "data": None}
print(js.dumps(data))
# {"resultCode": "SUCCESS", "data": null}
使用from import
from json import dumps
data = {"resultCode": "SUCCESS", "data": None}
print(dumps(data))
# {"resultCode": "SUCCESS", "data": null}
使用from import * 匯入json模組全部的名稱
不建議推薦使用,容易引發命名衝突
from json import *
data = {"resultCode": "SUCCESS", "data": None}
print(dumps(data))
# {"resultCode": "SUCCESS", "data": null}