Pthon Request库源码解读之__init__.py

首先我们需要了解下这个文件的功能:
init.py 文件在 Python 中有多种用途,但当我们讨论通过 pip 安装的插件或包时,其主要用途是为了确保:
包的结构完整性:
当你尝试导入一个包(文件夹)时,init.py 确保该文件夹被当作一个包来处理。也就是说,该文件允许你以 import package_name 的方式导入整个包。
初始化代码的执行:
在包的顶级目录中,init.py 可以包含一些初始化代码,这些代码在包首次被导入时执行。
避免命名冲突:
如果你有一个名为 my_module.py 的文件和一个名为 my_module 的包,Python 可能会因为命名冲突而无法正确地导入模块或包。通过添加一个 init.py 文件,你可以明确地告诉 Python 你希望该文件夹被视为一个包。
插件或扩展点:
对于某些插件或扩展系统,init.py 可能用于注册插件或定义扩展点。这样,当你使用这个插件时,相关的扩展或功能可以自动被激活。
所以,当你在 pip 中安装一个包时,通常会看到这个 init.py 文件。这不是必须的,但为了确保包的完整性、可导入性和其他功能,很多开发者选择添加这个文件。

init.py 代码解析:

import urllib3
import chardet
import warnings
from .exceptions import RequestsDependencyWarningdef check_compatibility(urllib3_version, chardet_version):urllib3_version = urllib3_version.split('.')assert urllib3_version != ['dev']  # Verify urllib3 isn't installed from git.# Sometimes, urllib3 only reports its version as 16.1.if len(urllib3_version) == 2:urllib3_version.append('0')# Check urllib3 for compatibility.major, minor, patch = urllib3_version  # noqa: F811major, minor, patch = int(major), int(minor), int(patch)# urllib3 >= 1.21.1, <= 1.24assert major == 1assert minor >= 21assert minor <= 24# Check chardet for compatibility.major, minor, patch = chardet_version.split('.')[:3]major, minor, patch = int(major), int(minor), int(patch)# chardet >= 3.0.2, < 3.1.0assert major == 3assert minor < 1assert patch >= 2def _check_cryptography(cryptography_version):# cryptography < 1.3.4try:cryptography_version = list(map(int, cryptography_version.split('.')))except ValueError:returnif cryptography_version < [1, 3, 4]:warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version)warnings.warn(warning, RequestsDependencyWarning)# Check imported dependencies for compatibility.
try:check_compatibility(urllib3.__version__, chardet.__version__)
except (AssertionError, ValueError):warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported ""version!".format(urllib3.__version__, chardet.__version__),RequestsDependencyWarning)# Attempt to enable urllib3's SNI support, if possible
try:from urllib3.contrib import pyopensslpyopenssl.inject_into_urllib3()# Check cryptography versionfrom cryptography import __version__ as cryptography_version_check_cryptography(cryptography_version)
except ImportError:pass# urllib3's DependencyWarnings should be silenced.
from urllib3.exceptions import DependencyWarning
warnings.simplefilter('ignore', DependencyWarning)from .__version__ import __title__, __description__, __url__, __version__
from .__version__ import __build__, __author__, __author_email__, __license__
from .__version__ import __copyright__, __cake__from . import utils
from . import packages
from .models import Request, Response, PreparedRequest
from .api import request, get, head, post, patch, put, delete, options
from .sessions import session, Session
from .status_codes import codes
from .exceptions import (RequestException, Timeout, URLRequired,TooManyRedirects, HTTPError, ConnectionError,FileModeWarning, ConnectTimeout, ReadTimeout
)# Set default logging handler to avoid "No handler found" warnings.
import logging
from logging import NullHandlerlogging.getLogger(__name__).addHandler(NullHandler())# FileModeWarnings go off per the default.
warnings.simplefilter('default', FileModeWarning, append=True)#这段代码主要做的是检查三个Python库(urllib3, chardet, 和 cryptography)的版本是否满足特定的兼容性要求。以下是详细的解释:
#check_compatibility 函数:
#输入:urllib3_version 和 chardet_version
#这个函数检查两个库的版本号是否满足特定的兼容性要求。
#首先,它确保urllib3不是从git安装的(通过断言assert实现)。
#然后,它检查urllib3的版本号。如果版本号只有两个部分(例如16.1),则添加第三个部分('0')。
#接下来,它检查urllib3的版本是否在1.21.1到1.24之间。
#最后,它检查chardet的版本是否在3.0.2到3.1.0之间。
#_check_cryptography 函数:
#输入:cryptography_version
#这个函数检查cryptography的版本是否小于1.3.4。如果是,则发出警告。
#主执行部分:
#首先,尝试调用check_compatibility函数,传入urllib3和chardet的当前版本作为参数。
#如果在这过程中抛出AssertionError或ValueError异常,则发出警告,指出urllib3或chardet的版本不满足兼容性要求。
#此外,它还尝试启用urllib3的SNI支持(如果可能),并检查cryptography的版本是否满足特定的版本要求。
#简而言之,这段代码的目的是确保所使用的库版本之间是兼容的,并在版本不兼容时给出警告#启用urllib3的SNI支持(如果可能):
#尝试从urllib3.contrib导入pyOpenSSL。
#调用pyOpenSSL.inject_into_urllib3()以尝试启用SNI支持。SNI(Server Name Indication)是一种TLS扩展,允许在一个TCP连接上使用多个SSL/TLS服务器证书。
#如果导入pyOpenSSL失败,则不会执行任何操作。
#静默urllib3的依赖警告:
#从urllib3.exceptions导入DependencyWarning。
#使用warnings.simplefilter('ignore', DependencyWarning)来静默此警告。
#导入版本和元数据:
#从当前包的__version__模块导入各种元数据,如标题、描述、URL、版本等。
#导入其他模块和函数:
#从utils, packages, models, api, sessions, status_codes, 和 exceptions中导入特定的函数、类和模块。
#设置默认的日志处理器:
#为了避免“没有找到处理器”的警告,为当前模块设置一个默认的日志处理器。这是通过添加一个NullHandler实现的。
#处理FileModeWarning警告:
#使用warnings.simplefilter('default', FileModeWarning, append=True)来设置FileModeWarning的默认行为。这意味着对于FileModeWarning,将使用Python的默认警告行为。
#总体来说,这段代码主要是关于导入各种库和模块,并进行一些初始化和配置。它涉及到版本信息、日志处理、警告处理和库之间的依赖关系。

总体来说,当我们引入request库时,init.py文件会做一些初始化的处理,还有一些依赖性的验证,确保当前功能可用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/581492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据类型-变量-内存四区-指针

1、内存四区 1.1、数据类型的本质 1&#xff09;数据类型基本概念 类型是对数据的抽象类型相同的数据具有相同的表示形式、存储格式、相关的操作程序中使用的数据必定属于某种数据类型数据类型和内存 有关系C/C 引入数据类型&#xff0c;可以更方便地管理数据 2&#xff09…

laravel5.8中实现验证码组件的安装和验证

本篇文章主要讲解使用laravel5.8自带的验证码库实现验证码验证的效果教程。通过本教程你可以快速接入到自己的项目中开发相应的验证功能。 作者&#xff1a;任聪聪 (rccblogs.com) 日期&#xff1a;2023年12月17日 实际效果 安装步骤 步骤一、输入命令 composer require mews…

beego使用布局文件和模板文件进行页面渲染

在 Beego 框架中的控制器基类 Controller 中自定义一个方法&#xff0c;用于渲染模板文件并设置模板数据。 func (this *IndexController) display(tplname string) {this.Layout this.moduleName "/layout.html"this.TplName tplnamethis.LayoutSections make(…

小程序开发与移动应用开发有哪些区别?

小程序开发与移动应用开发&#xff1a;差异何在&#xff1f; 在数字化浪潮下&#xff0c;小程序和移动应用已成为人们日常生活中不可或缺的一部分。但你是否真正了解小程序开发与移动应用开发之间的区别&#xff1f;这篇文章将为你揭开两者之间的神秘面纱。 一、运行环境不同…

不限带宽是否意味着无限带宽

当今互联网发展迅速的时代&#xff0c;带宽成为了网络连接速度的重要指标之一。而对于许多用户来说&#xff0c;无限带宽似乎是一个理想的选择。不限带宽并不等于无限带宽。我将解释不限带宽的含义&#xff0c;并探讨其与无限带宽之间的区别。 不限带宽是指网络服务提供商&…

夸克 自动脚本 每次挖到自动输代码

一个bash脚本,功能是持续运行一个名为`mint-dft`的Yarn CLI命令,并在出现错误时自动重试。 代码解释: 1. `#!/bin/bash`: 这是shebang行,告诉系统使用/bin/bash来解析和执行这个脚本。 2. `export NODE_OPTIONS=--max_old_space_size=49152`: 这一行设置了环境变…

Navicat 年度报告 (2023) | 不忘初心,砥砺前行

#SUMMARY#年度报告 时光荏苒&#xff0c;转眼时间来到 2023 年与 2024 年交汇处。回顾 2023&#xff0c;数据库行业跌宕起伏&#xff0c;暗流涌动。作为数据库工具提供商 Navicat&#xff0c;我们也面临着诸多挑战与压力。一直以来&#xff0c;我们以用户体验为先、技术为本&a…

代理模式:中间者的故事

代理模式&#xff1a;中间者的故事 介绍需求分析代理模式代码实现代理模式整理和用途第一种用途第二种用途第三种用途第四种用途 总结 介绍 本文引用《大话设计模式》第七章节的内容进行学习分析&#xff0c;仅供学习使用 需求&#xff1a;小明拜托自己好朋友小王给他朋友小美…

Swift函数式编程——函数

目录 Swift函数式编程&#xff0d;函数 高阶函数&#xff08;Higher order function&#xff09; 一等函数&#xff08;First class function&#xff09; 闭包 函数柯里化&#xff08;Function Curring&#xff09; 函数式思维 使用函数解决问题 使用函数组合 总结 Sw…

解决IDEA 不能正确识别系统环境变量的问题

问题描述 本人laptop 上的是设置了GOOGLE_APPLICATION_CREDENTIALS 这个环境变量的&#xff0c; 正常java or python 的程序能基于这个环境变量使用 某个gcp service account 去访问GCP的资源 [gatemanmanjaro-x13 ~]$ env | grep -i google GOOGLE_APPLICATION_CREDENTIALS/…

2023年,写博客带给我的收获与成长

文章目录 前言写博客的心路历程膜拜写博客大佬博客大佬带来的诱惑尝试写博客坚持写博客 决定写博客的原因2023年写博客的成就博客的创作粉丝的增长博客专家成就商务合作 2024年对技术写作的展望 前言 没错&#xff0c;我就是那个考试睡大觉、作文空白交卷的王二蛋。面对写作&a…

Tensor轴变换 axis 或 dim(transpose、permute、view、reshape、einsum)

操作分类&#xff1a; 重排维度&#xff1a;transpose、swapaxes、permute都是对维度进行重排序&#xff0c;但不改变维度的大小。 重组维度&#xff1a;view、reshape可以重组原始维度&#xff0c;修改维度大小。 万能运算&#xff1a;einsum 通过操作index(dim/axis)来匹配…

SpringBoot2.7-集成Knife4j

Knife4j 是什么 Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案 添加依赖 <!--引入Knife4j的官方start包,该指南选择Spring Boot版本<3.0,开发者需要注意--> <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knif…

Django Cookie和Session使用(十一)

一、Cookie Cookie具体指一小段信息&#xff0c;它是服务器发送出来存储在浏览器上的一组键值对&#xff0c;下次访问服务器时浏览器会自动携带这些键值对&#xff0c;以便服务器提取有用信息。 Cookie的特性 1、服务器让浏览器进行设置的 2、保存在浏览器本地&#xff0c;…

Permutation Importance重要性

目录 <font colorblue size4 face"楷体">算法解构<font colorblue size4 face"楷体">代码 算法解构 Permutation Importance适用于表格型数据&#xff0c;其对于特征重要性的评判取决于该特征被随机重排后&#xff0c;模型表现评分的下降程度…

免费API-JSONPlaceholder使用手册

官方使用指南快速索引>>点这里 快速导览&#xff1a; 什么是JSONPlaceholder?有啥用?如何使用JSONPlaceholder? 关于“增”关于“改”关于“查”关于“删”关于“分页查”关于“根据ID查多个” 尝试自己搭一个&#xff1f;扩展的可能&#xff1f; 什么是JSONPlaceho…

面向对象(高级)知识点强势总结!!!

文章目录 一、知识点复习1-关键字&#xff1a;static1、知识点2、重点 2-单例模式&#xff08;或单子模式&#xff09;1、知识点2、重点 3-理解main()方法1、知识点2、重点 4-类的成员之四&#xff1a;代码块1、知识点2、重点 5-关键字&#xff1a;final1、知识点2、重点 6-关键…

新建虚拟环境并与Jupyter内核连接

第一步:在cmd里新建虚拟环境,shap38是新建的虚拟环境的名字 ,python=3.x conda create -n shap38 python=3.8第二步,安装ipykernel,打开anconda powershell prompt: 虚拟环境的文件夹位置,我的如图所示: 进入文件夹并复制地址: 输入复制的文件夹地址更改文件夹:…

单挑力扣(LeetCode)SQL题:534. 游戏玩法分析 III(难度:中等)

题目&#xff1a;534. 游戏玩法分析 III &#xff08;通过次数23,825 | 提交次数34,947&#xff0c;通过率68.17%&#xff09; Table:Activity----------------------- | Column Name | Type | ----------------------- | player_id | int | | device_id | int…

交换域系数的选择:图像处理与编码的关键策略

在图像处理和编码领域&#xff0c;选择适当的交换域系数对于实现高效的图像处理和编码至关重要。交换域系数是指在特定的数学变换下产生的频域系数。通过选择合适的交换域系数&#xff0c;可以实现图像的压缩、增强和重构。本文将深入探讨交换域系数的选择在图像处理和编码中的…