初始模块与软件包
初始模块与软件包
简介
对于初学者来说,通常只需要一个.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}

浙公网安备 33010602011771号