您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

在 Kubernetes 上使用 Flask 搭建 Python 微服务

时间:2022-10-20 17:13:07  来源:Linux   作者:

导读:微服务遵循领域驱动设计(DDD),与开发平台无关。Python/ target=_blank class=infotextkey>Python 微服务也不例外。Python3 的面向对象特性使得按照 DDD 对服务进行建模变得更加容易。

本文字数:12786,阅读时长大约: 15分钟

微服务遵循领域驱动设计(DDD),与开发平台无关。Python 微服务也不例外。Python3 的面向对象特性使得按照 DDD 对服务进行建模变得更加容易。本系列的第 10 部分演示了如何将用户管理系统的查找服务作为 Python 微服务部署在 Kube.NETes 上。

微服务架构的强大之处在于它的多语言性。企业将其功能分解为一组微服务,每个团队自由选择一个平台。

我们的用户管理系统已经分解为四个微服务,分别是添加、查找、搜索和日志服务。添加服务在 JAVA 平台上开发并部署在 Kubernetes 集群上,以实现弹性和可扩展性。这并不意味着其余的服务也要使用 Java 开发,我们可以自由选择适合个人服务的平台。

让我们选择 Python 作为开发查找服务的平台。查找服务的模型已经设计好了(参考 2022 年 3 月份的文章),我们只需要将这个模型转换为代码和配置。

Pythonic 方法

Python 是一种通用编程语言,已经存在了大约 30 年。早期,它是自动化脚本的首选。然而,随着 Django 和 Flask 等框架的出现,它的受欢迎程度越来越高,现在各种领域中都在应用它,如企业应用程序开发。数据科学和机器学习进一步推动了它的发展,Python 现在是三大编程语言之一。

许多人将 Python 的成功归功于它容易编码。这只是一部分原因。只要你的目标是开发小型脚本,Python 就像一个玩具,你会非常喜欢它。然而,当你进入严肃的大规模应用程序开发领域时,你将不得不处理大量的ifelse,Python 变得与任何其他平台一样好或一样坏。例如,采用一种面向对象的方法!许多 Python 开发人员甚至可能没意识到 Python 支持类、继承等功能。Python 确实支持成熟的面向对象开发,但是有它自己的方式 -- Pythonic!让我们探索一下!

领域模型

AddService通过将数据保存到一个 MySQL 数据库中来将用户添加到系统中。FindService的目标是提供一个 REST API 按用户名查找用户。域模型如图 1 所示。它主要由一些值对象组成,如User实体的NamePhoneNumber以及UserRepository

图 1: 查找服务的域模型

让我们从Name开始。由于它是一个值对象,因此必须在创建时进行验证,并且必须保持不可变。基本结构如所示:

 

  1. class Name:

     

  2. value: str

     

  3. def __post_init__(self):

     

  4. if self.value is None or len(self.value.strip()) < 8 or len(self.value.strip()) > 32:

     

  5. rAIse ValueError("Invalid Name")

     

如你所见,Name包含一个字符串类型的值。作为后期初始化的一部分,我们会验证它。

Python 3.7 提供了@dataclass装饰器,它提供了许多开箱即用的数据承载类的功能,如构造函数、比较运算符等。如下是装饰后的Name类:

 

  1. from dataclasses import dataclass

     

  2. @dataclass

  3. class Name:

  4. value: str

  5. def __post_init__(self):

  6. if self.value is None or len(self.value.strip()) < 8 or len(self.value.strip()) > 32:

  7. raise ValueError("Invalid Name")

 

以下代码可以创建一个Name对象:

 

  1. name = Name("Krishna")

value属性可以按照如下方式读取或写入:

 

  1. name.value = "Mohan"

     

  2. print(name.value)

     

可以很容易地与另一个Name对象比较,如下所示:

 

  1. other = Name("Mohan")

     

  2. if name == other:

     

  3. print("same")

     

如你所见,对象比较的是值而不是引用。这一切都是开箱即用的。我们还可以通过冻结对象使对象不可变。这是Name值对象的最终版本:

 

  1. from dataclasses import dataclass

     

  2. @dataclass(frozen=True)

  3. class Name:

  4. value: str

  5. def __post_init__(self):

  6. if self.value is None or len(self.value.strip()) < 8 or len(self.value.strip()) > 32:

  7. raise ValueError("Invalid Name")

     

PhoneNumber也遵循类似的方法,因为它也是一个值对象:

 

  1. @dataclass(frozen=True)

     

  2. class PhoneNumber:

     

  3. value: int

     

  4. def __post_init__(self):

     

  5. if self.value < 9000000000:

     

  6. raise ValueError("Invalid Phone Number")

     

 

User类是一个实体,不是一个值对象。换句话说,User是可变的。以下是结构:

 

  1. from dataclasses import dataclass

     

  2. import datetime

     

  3. @dataclass

  4. class User:

  5. _name: Name

  6. _phone: PhoneNumber

  7. _since: datetime.datetime

  8. def __post_init__(self):

  9. if self._name is None or self._phone is None:

  10. raise ValueError("Invalid user")

  11. if self._since is None:

  12. self.since = datetime.datetime.now()
     

你能观察到User并没有冻结,因为我们希望它是可变的。但是,我们不希望所有属性都是可变的。标识字段如_name_since是希望不会修改的。那么,这如何做到呢?

Python3 提供了所谓的描述符协议,它会帮助我们正确定义 getter 和 setter。让我们使用@property装饰器将 getter 添加到User的所有三个字段中。

 

  1. @property

  2. def name(self) -> Name:

  3. return self._name

  4. @property

  5. def phone(self) -> PhoneNumber:

  6. return self._phone

  7. @property

  8. def since(self) -> datetime.datetime:

  9. return self._since

phone字段的 setter 可以使用@<字段>.setter来装饰:

 

  1. @phone.setter

  2. def phone(self, phone: PhoneNumber) -> None:

  3. if phone is None:

  4. raise ValueError("Invalid phone")

  5. self._phone = phone

 

通过重写__str__()函数,也可以为User提供一个简单的打印方法:

 

  1. def __str__(self):

  2. return self.name.value + " [" + str(self.phone.value) + "] since " + str(self.since)

     

这样,域模型的实体和值对象就准备好了。创建异常类如下所示:

 

  1. class UserNotFoundException(Exception):

  2. pass

     

域模型现在只剩下UserRepository了。Python 提供了一个名为abc的有用模块来创建抽象方法和抽象类。因为UserRepository只是一个接口,所以我们可以使用abc模块。

任何继承自abc.ABC的类都将变为抽象类,任何带有@abc.abstractmethod装饰器的函数都会变为一个抽象函数。下面是UserRepository的结构:

 

  1. from abc import ABC, abstractmethod

     

  2. class UserRepository(ABC):

  3. @abstractmethod

  4. def fetch(self, name:Name) -> User:

  5. pass

 

UserRepository遵循仓储模式。换句话说,它在User实体上提供适当的 CRUD 操作,而不会暴露底层数据存储语义。在本例中,我们只需要fetch()操作,因为FindService只查找用户。

因为UserRepository是一个抽象类,我们不能从抽象类创建实例对象。创建对象必须依赖于一个具体类实现这个抽象类。数据层UserRepositoryImpl提供了UserRepository的具体实现:

 

  1. class UserRepositoryImpl(UserRepository):

     

  2. def fetch(self, name:Name) -> User:

     

  3. pass

     

 

由于AddService将用户数据存储在一个 MySQL 数据库中,因此UserRepositoryImpl也必须连接到相同的数据库去检索数据。下面是连接到数据库的代码。注意,我们正在使用 MySQL 的连接库。

 

  1. from mysql.connector import connect, Error

     

  2. class UserRepositoryImpl(UserRepository):

  3. def fetch(self, name:Name) -> User:

  4. try:

  5. with connect(

  6. host="mysqldb",

  7. user="root",

  8. password="admin",

  9. database="glarimy",

  10. ) as connection:

  11. with connection.cursor() as cursor:

  12. cursor.execute("SELECT * FROM ums_users where name=%s", (name.value,))

  13. row = cursor.fetchone()

  14. if cursor.rowcount == -1:

  15. raise UserNotFoundException()

  16. else:

  17. return User(Name(row[0]), PhoneNumber(row[1]), row[2])

  18. except Error as e:

  19. raise e

在上面的片段中,我们使用用户root/ 密码admin连接到一个名为mysqldb的数据库服务器,使用名为glarimy的数据库(模式)。在演示代码中是可以包含这些信息的,但在生产中不建议这么做,因为这会暴露敏感信息。

fetch()操作的逻辑非常直观,它对ums_users表执行 SELECT 查询。回想一下,AddService正在将用户数据写入同一个表中。如果 SELECT 查询没有返回记录,fetch()函数将抛出UserNotFoundException异常。否则,它会从记录中构造User实体并将其返回给调用者。这没有什么特殊的。

应用层

最终,我们需要创建应用层。此模型如图 2 所示。它只包含两个类:控制器和一个 DTO。

图 2: 添加服务的应用层

众所周知,一个 DTO 只是一个没有任何业务逻辑的数据容器。它主要用于在FindService和外部之间传输数据。我们只是提供了在 REST 层中将UserRecord转换为字典以便用于 JSON 传输:

 

  1. class UserRecord:

     

  2. def toJSON(self):

     

  3. return {

     

  4. "name": self.name,

     

  5. "phone": self.phone,

     

  6. "since": self.since

     

  7. }

     

 

控制器的工作是将 DTO 转换为用于域服务的域对象,反之亦然。可以从find()操作中观察到这一点。

 

  1. class UserController:

     

  2. def __init__(self):

  3. self._repo = UserRepositoryImpl()

  4. def find(self, name: str):

  5. try:

  6. user: User = self._repo.fetch(Name(name))

  7. record: UserRecord = UserRecord()

  8. record.name = user.name.value

  9. record.phone = user.phone.value

  10. record.since = user.since

  11. return record

  12. except UserNotFoundException as e:

  13. return None

 

find()操作接收一个字符串作为用户名,然后将其转换为Name对象,并调用UserRepository获取相应的User对象。如果找到了,则使用检索到的User`` 对象创建UserRecord`。回想一下,将域对象转换为 DTO 是很有必要的,这样可以对外部服务隐藏域模型。

UserController不需要有多个实例,它也可以是单例的。通过重写__new__,可以将其建模为一个单例。

 

  1. class UserController:

  2. def __new__(self):

  3. if not hasattr(self, ‘instance’):

  4. self.instance = super().__new__(self)

  5. return self.instance

  6. def __init__(self):

  7. self._repo = UserRepositoryImpl()

  8. def find(self, name: str):

  9. try:

  10. user: User = self._repo.fetch(Name(name))

  11. record: UserRecord = UserRecord()

  12. record.name = user.name.getValue()

  13. record.phone = user.phone.getValue()

  14. record.since = user.since

  15. return record

  16. except UserNotFoundException as e:

  17. return None

 

我们已经完全实现了FindService的模型,剩下的唯一任务是将其作为 REST 服务公开。

REST API

FindService只提供一个 API,那就是通过用户名查找用户。显然 URI 如下所示:

 

  1. GET /user/{name}

     

此 API 希望根据提供的用户名查找用户,并以 JSON 格式返回用户的电话号码等详细信息。如果没有找到用户,API 将返回一个 404 状态码。

我们可以使用 Flask 框架来构建 REST API,它最初的目的是使用 Python 开发 Web 应用程序。除了 html 视图,它还进一步扩展到支持 REST 视图。我们选择这个框架是因为它足够简单。 创建一个 Flask 应用程序:

 

  1. from flask import Flask

     

  2. App = Flask(__name__)

     

 

然后为 Flask 应用程序定义路由,就像函数一样简单:

 

  1. @app.route('/user/')

     

  2. def get(name):

     

  3. pass

     

注意@app.route映射到 API/user/,与之对应的函数的get()

如你所见,每次用户访问 API 如http://server:port/user/Krishna时,都将调用这个get()函数。Flask 足够智能,可以从 URL 中提取Krishna作为用户名,并将其传递给get()函数。

get()函数很简单。它要求控制器找到该用户,并将其与通常的 HTTP 头一起打包为 JSON 格式后返回。如果控制器返回None,则get()函数返回合适的 HTTP 状态码。

 

  1. from flask import jsonify, abort

  2. controller = UserController()

  3. record = controller.find(name)

  4. if record is None:

  5. abort(404)

  6. else:

  7. resp = jsonify(record.toJSON())

  8. resp.status_code = 200

  9. return resp

     

最后,我们需要 Flask 应用程序提供服务,可以使用waitress服务:

 

  1. from waitress import serve

  2. serve(app, host="0.0.0.0", port=8080)

 

在上面的片段中,应用程序在本地主机的 8080 端口上提供服务。最终代码如下所示:

 

  1. from flask import Flask, jsonify, abort

  2. from waitress import serve

  3. app = Flask(__name__)

  4. @app.route('/user/')

  5. def get(name):

  6. controller = UserController()

  7. record = controller.find(name)

  8. if record is None:

  9. abort(404)

  10. else:

  11. resp = jsonify(record.toJSON())

  12. resp.status_code = 200

  13. return resp

  14. serve(app, host="0.0.0.0", port=8080)

 

部署

FindService的代码已经准备完毕。除了 REST API 之外,它还有域模型、数据层和应用程序层。下一步是构建此服务,将其容器化,然后部署到 Kubernetes 上。此过程与部署其他服务妹有任何区别,但有一些 Python 特有的步骤。

在继续前进之前,让我们来看下文件夹和文件结构:

 

  1. + ums-find-service

  2. + ums

  3. - domain.py

  4. - data.py

  5. - app.py

  6. - Dockerfile

  7. - requirements.txt

  8. - kube-find-deployment.yml

     

如你所见,整个工作文件夹都位于ums-find-service下,它包含了ums文件夹中的代码和一些配置文件,例如Dockerfilerequirements.txtkube-find-deployment.yml

domain.py包含域模型,data.py包含UserRepositoryImplapp.py包含剩余代码。我们已经阅读过代码了,现在我们来看看配置文件。

第一个是requirements.txt,它声明了 Python 系统需要下载和安装的外部依赖项。我们需要用查找服务中用到的每个外部 Python 模块来填充它。如你所见,我们使用了 MySQL 连接器、Flask 和 Waitress 模块。因此,下面是requirements.txt的内容。

 

  1. Flask==2.1.1

  2. Flask_RESTful

  3. mysql-connector-python

  4. waitress

     

第二步是在Dockerfile中声明 Docker 相关的清单,如下:

 

  1. FROM python:3.8-slim-buster

  2. WORKDIR /ums

  3. ADD ums /ums

  4. ADD requirements.txt requirements.txt

  5. RUN pip3 install -r requirements.txt

  6. EXPOSE 8080

  7. ENTRYPOINT ["python"]

  8. CMD ["/ums/app.py"]

 

总的来说,我们使用 Python 3.8 作为基线,除了移动requirements.txt之外,我们还将代码从ums文件夹移动到 Docker 容器中对应的文件夹中。然后,我们指示容器运行pip3 install命令安装对应模块。最后,我们向外暴露 8080 端口(因为 waitress 运行在此端口上)。

为了运行此服务,我们指示容器使用使用以下命令:

 

  1. python /ums/app.py

 

一旦Dockerfile准备完成,在ums-find-service文件夹中运行以下命令,创建 Docker 镜像:

 

  1. docker build -t glarimy/ums-find-service

     

它会创建 Docker 镜像,可以使用以下命令查找镜像:

 

  1. docker images

     

尝试将镜像推送到 Docker Hub,你也可以登录到 Docker。

 

  1. docker login

  2. docker push glarimy/ums-find-service

 

最后一步是为 Kubernetes 部署构建清单。

在之前的文章中,我们已经介绍了如何建立 Kubernetes 集群、部署和使用服务的方法。我假设仍然使用之前文章中的清单文件来部署添加服务、MySQL、Kafka 和 Zookeeper。我们只需要将以下内容添加到kube-find-deployment.yml文件中:

 

  1. apiVersion: apps/v1

  2. kind: Deployment

  3. metadata:

  4. name: ums-find-service

  5. labels:

  6. app: ums-find-service

  7. spec:

  8. replicas: 3

  9. selector:

  10. matchLabels:

  11. app: ums-find-service

  12. template:

  13. metadata:

  14. labels:

  15. app: ums-find-service

  16. spec:

  17. containers:

  18. - name: ums-find-service

  19. image: glarimy/ums-find-service

  20. ports:

  21. - containerPort: 8080

  22. ---

  23. apiVersion: v1

  24. kind: Service

  25. metadata:

  26. name: ums-find-service

  27. labels:

  28. name: ums-find-service

  29. spec:

  30. type: LoadBalancer

  31. ports:

  32. - port: 8080

  33. selector:

  34. app: ums-find-service

     

上面清单文件的第一部分声明了glarimy/ums-find-service镜像的FindService,它包含三个副本。它还暴露 8080 端口。清单的后半部分声明了一个 Kubernetes 服务作为FindService部署的前端。请记住,在之前文章中,mysqldb 服务已经是上述清单的一部分了。

运行以下命令在 Kubernetes 集群上部署清单文件:

 

  1. kubectl create -f kube-find-deployment.yml

 

部署完成后,可以使用以下命令验证容器组和服务:

 

  1. kubectl get services

     

输出如图 3 所示:

图 3: Kubernetes 服务

它会列出集群上运行的所有服务。注意查找服务的外部 IP,使用curl调用此服务:

 

  1. curl http://10.98.45.187:8080/user/KrishnaMohan

     

注意:10.98.45.187 对应查找服务,如图 3 所示。

如果我们使用AddService创建一个名为KrishnaMohan的用户,那么上面的curl命令看起来如图 4 所示:

图 4: 查找服务

用户管理系统(UMS)的体系结构包含AddServiceFindService,以及存储和消息传递所需的后端服务,如图 5 所示。可以看到终端用户使用ums-add-service的 IP 地址添加新用户,使用ums-find-service的 IP 地址查找已有用户。每个 Kubernetes 服务都由三个对应容器的节点支持。还要注意:同样的 mysqldb 服务用于存储和检索用户数据。

图 5: UMS 的添加服务和查找服务

其他服务

UMS 系统还包含两个服务:SearchServiceJournalService。在本系列的下一部分中,我们将在 Node 平台上设计这些服务,并将它们部署到同一个 Kubernetes 集群,以演示多语言微服务架构的真正魅力。最后,我们将观察一些与微服务相关的设计模式。

via:

作者: 选题: 译者: 校对:

本文由 原创编译, 荣誉推出

LCTT 译者 :MjSeven

翻译: 171.0 篇

贡献: 1720 天

2018-01-30

2022-10-16

https://linux.cn/lctt/MjSeven

欢迎遵照 CC-BY-SA 协议规定转载,

如需转载,请在文章下留言 “ 转载:公众号名称”,



Tags:Python   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
一篇文章教会你使用Python中三种简单的函数
所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。一、函数简介所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。二、函数定义...【详细内容】
2024-04-11  Search: Python  点击:(3)  评论:(0)  加入收藏
一篇文章带你了解Python的分布式进程接口
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。一、前言在Thread和Process中,应当优...【详细内容】
2024-04-11  Search: Python  点击:(2)  评论:(0)  加入收藏
Python 可视化:Plotly 库使用基础
当使用 Plotly 进行数据可视化时,我们可以通过以下示例展示多种绘图方法,每个示例都会有详细的注释和说明。1.创建折线图import plotly.graph_objects as go# 示例1: 创建简单...【详细内容】
2024-04-01  Search: Python  点击:(8)  评论:(0)  加入收藏
Python 办公神器:教你使用 Python 批量制作 PPT
介绍本文将介绍如何使用openpyxl和pptx库来批量制作PPT奖状。本文假设你已经安装了python和这两个库。本文的场景是:一名基层人员,要给一次比赛活动获奖的500名选手制作奖状,并...【详细内容】
2024-03-26  Search: Python  点击:(18)  评论:(0)  加入收藏
Python实现工厂模式、抽象工厂,单例模式
工厂模式是一种常见的设计模式,它可以帮助我们创建对象的过程更加灵活和可扩展。在Python中,我们可以使用函数和类来实现工厂模式。一、Python中实现工厂模式工厂模式是一种常...【详细内容】
2024-03-07  Search: Python  点击:(34)  评论:(0)  加入收藏
不可不学的Python技巧:字典推导式使用全攻略
Python的字典推导式是一种优雅而强大的工具,用于创建字典(dict)。这种方法不仅代码更加简洁,而且执行效率高。无论你是Python新手还是有经验的开发者,掌握字典推导式都将是你技能...【详细内容】
2024-02-22  Search: Python  点击:(35)  评论:(0)  加入收藏
如何进行Python代码的代码重构和优化?
Python是一种高级编程语言,它具有简洁、易于理解和易于维护的特点。然而,代码重构和优化对于保持代码质量和性能至关重要。什么是代码重构?代码重构是指在不改变代码外部行为的...【详细内容】
2024-02-22  Search: Python  点击:(36)  评论:(0)  加入收藏
Python开发者必备的八个PyCharm插件
在编写代码的过程中,括号几乎无处不在,以至于有时我们会拼命辨别哪个闭合括号与哪个开头的括号相匹配。这款插件能帮助解决这个众所周知的问题。前言在PyCharm中浏览插件列表...【详细内容】
2024-01-26  Search: Python  点击:(89)  评论:(0)  加入收藏
Python的Graphlib库,再也不用手敲图结构了
Python中的graphlib库是一个功能强大且易于使用的工具。graphlib提供了许多功能,可以帮助您创建、操作和分析图形对象。本文将介绍graphlib库的主要用法,并提供一些示例代码和...【详细内容】
2024-01-26  Search: Python  点击:(88)  评论:(0)  加入收藏
大语言模型插件功能在携程的Python实践
作者简介成学,携程高级安全研发工程师,关注Python/Golang后端开发、大语言模型等领域。一、背景2023年初,科技圈最火爆的话题莫过于大语言模型了,它是一种全新的聊天机器人模型,...【详细内容】
2024-01-26  Search: Python  点击:(76)  评论:(0)  加入收藏
▌简易百科推荐
一篇文章教会你使用Python中三种简单的函数
所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。一、函数简介所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。二、函数定义...【详细内容】
2024-04-11  Go语言进阶学习  微信公众号  Tags:Python   点击:(3)  评论:(0)  加入收藏
一篇文章带你了解Python的分布式进程接口
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。一、前言在Thread和Process中,应当优...【详细内容】
2024-04-11  Go语言进阶学习    Tags:Python   点击:(2)  评论:(0)  加入收藏
Python 可视化:Plotly 库使用基础
当使用 Plotly 进行数据可视化时,我们可以通过以下示例展示多种绘图方法,每个示例都会有详细的注释和说明。1.创建折线图import plotly.graph_objects as go# 示例1: 创建简单...【详细内容】
2024-04-01  Python技术    Tags:Python   点击:(8)  评论:(0)  加入收藏
Python 办公神器:教你使用 Python 批量制作 PPT
介绍本文将介绍如何使用openpyxl和pptx库来批量制作PPT奖状。本文假设你已经安装了python和这两个库。本文的场景是:一名基层人员,要给一次比赛活动获奖的500名选手制作奖状,并...【详细内容】
2024-03-26  Python技术  微信公众号  Tags:Python   点击:(18)  评论:(0)  加入收藏
Python实现工厂模式、抽象工厂,单例模式
工厂模式是一种常见的设计模式,它可以帮助我们创建对象的过程更加灵活和可扩展。在Python中,我们可以使用函数和类来实现工厂模式。一、Python中实现工厂模式工厂模式是一种常...【详细内容】
2024-03-07  Python都知道  微信公众号  Tags:Python   点击:(34)  评论:(0)  加入收藏
不可不学的Python技巧:字典推导式使用全攻略
Python的字典推导式是一种优雅而强大的工具,用于创建字典(dict)。这种方法不仅代码更加简洁,而且执行效率高。无论你是Python新手还是有经验的开发者,掌握字典推导式都将是你技能...【详细内容】
2024-02-22  子午Python  微信公众号  Tags:Python技巧   点击:(35)  评论:(0)  加入收藏
如何进行Python代码的代码重构和优化?
Python是一种高级编程语言,它具有简洁、易于理解和易于维护的特点。然而,代码重构和优化对于保持代码质量和性能至关重要。什么是代码重构?代码重构是指在不改变代码外部行为的...【详细内容】
2024-02-22  编程技术汇    Tags:Python代码   点击:(36)  评论:(0)  加入收藏
Python开发者必备的八个PyCharm插件
在编写代码的过程中,括号几乎无处不在,以至于有时我们会拼命辨别哪个闭合括号与哪个开头的括号相匹配。这款插件能帮助解决这个众所周知的问题。前言在PyCharm中浏览插件列表...【详细内容】
2024-01-26  Python学研大本营  微信公众号  Tags:PyCharm插件   点击:(89)  评论:(0)  加入收藏
Python的Graphlib库,再也不用手敲图结构了
Python中的graphlib库是一个功能强大且易于使用的工具。graphlib提供了许多功能,可以帮助您创建、操作和分析图形对象。本文将介绍graphlib库的主要用法,并提供一些示例代码和...【详细内容】
2024-01-26  科学随想录  微信公众号  Tags:Graphlib库   点击:(88)  评论:(0)  加入收藏
Python分布式爬虫打造搜索引擎
简单分布式爬虫结构主从模式是指由一台主机作为控制节点负责所有运行网络爬虫的主机进行管理,爬虫只需要从控制节点那里接收任务,并把新生成任务提交给控制节点就可以了,在这个...【详细内容】
2024-01-25  大雷家吃饭    Tags:Python   点击:(59)  评论:(0)  加入收藏
站内最新
站内热门
站内头条