" name="sm-site-verification"/>
侧边栏壁纸
博主头像
PySuper博主等级

千里之行,始于足下

  • 累计撰写 203 篇文章
  • 累计创建 14 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Python代码优化

PySuper
2024-06-12 / 0 评论 / 0 点赞 / 38 阅读 / 6171 字
温馨提示:
所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

DataClass

DataClass 是 Python 3.7 引入的一个装饰器,用于简化创建类的方法

它自动生成一些常用的特殊方法,比如 __init__()__repr__()__eq__() 等。

主要用处:

  • 减少样板代码:不需要手动编写初始化方法等。

  • 更清晰的类定义:通过注解定义属性,更清晰地展示类的结构。

  • 自动生成特殊方法:如 __init__()__repr__()__eq__()

import inspect
import dataclasses


@dataclasses.dataclass(frozen=True, order=True)
class Person:
    """
    在我们使用字典传递信息的时候,可以尝试使用数据类的方式,保证数据传递正确
    也可以使用Pydantic的方式
    """
    name: str
    age: int
    city: str


zheng = Person(name="zheng", age=18, city="Beijing")

print(zheng.name)
print(zheng)

# 以字典形式打印
print(dataclasses.asdict(zheng))

# 查看当前类中有哪些方法
print(inspect.getmembers(Person, predicate=inspect.isfunction))

Pydantic

Pydantic 是一个数据验证和设置管理的库。

基于 Python 类型注解,通过提供数据验证、解析和复杂模型支持来提升数据处理的安全性和可维护性。

主要用处:

  • 数据验证:在模型初始化时自动验证数据类型和格式。

  • 数据解析:支持复杂的数据结构和嵌套模型。

  • 自动转换:能够根据类型注解自动转换输入数据类型。

from datetime import datetime
from typing import List, Optional

from pydantic import BaseModel, ValidationError


def print_red(text):
    """用红色显示字体的方法"""
    print("\033[31m {}\033[0m".format(text))


print_red("Pydantic限制类型")


class Student(BaseModel):
    """
    用户类,使用Pydantic限制类型
    """
    id: int
    name: str
    signup_ts: datetime
    last_login_ts: Optional[datetime] = None
    friends: List[int] = []


student = Student(id=1, name="John", signup_ts=datetime.now())
print(student.signup_ts)

Type Hint

Type Hint 是 Python 3.5 引入的特性。

通过为函数、变量和类属性提供类型注解,帮助开发者和 IDE 更好地理解代码的预期行为。

主要用处:

  • 提高代码可读性:明确函数参数和返回值的类型。

  • 增强静态分析:借助类型检查工具(如 mypy)进行静态类型检查。

  • 改进自动补全和文档生成:让 IDE 提供更好的代码提示和文档生成支持。

推广的工程优点:

  • 几乎没有 run time 惩罚,就是不会导致项目运行变慢

  • 渐进式的类型标注,就是可以一点一点的修改整个项目中的代码,写了type hint 就检查,没写就不检查

  • feature:

def func(a: int, b: int) -> int:
    """返回a+b的结果"""
    return a + b

class A:
    name = "A"


def get_name(a: A) -> str:
    return a.name


class Node:
    """
    双向链表==> 这里传递参数是Node自身
    但是在传入的时候,这个Node还没有被创建出来,就无法直接使用Node
    所以这里添加双引号,来实现调用
    """

    def __init__(self, prev: "Node"):
        self.prev = prev
        self.next = None


def my_sum(lst: list[int]) -> int:
    """在list里面指定数据类型"""
    key = 0
    for i in lst:
        key += i
    return key

# 对于 list 和 tuple 的情况,使用 Sequence
from typing import Sequence
def my_sum_2(lst: Sequence[int]) -> int:
    """
    在list里面指定数据类型,使用Sequence 就变成 list tuple都可以传递
    """
    key = 0
    for i in lst:
        key += i
    return key

# dictionary
def my_sum_3(dicts: dict[str, int]) -> int:
    """在list里面指定数据类型"""
    key = 0
    for i in dicts.values():
        key += i
    return key

my_sum_3({"a": 1, "b": 2, "c": 3})

# None ==> Union、|、Optional
from typing import Union
def my_sum_4(key: Union[int, None]) -> Union:
    if key is None:
        return None
    return key

def my_sum_5(key: int | None) -> int:
    if key is None:
        return 0
    return key

from typing import Optional
def my_sum_6(key: Optional[int]) -> int:
    if key is None:
        return 0
    return key

# 对变量进行类型标注
user_list: list[int] = []
user_list.append(1)
print(user_list)

# Any ==> 什么类型都可以,默认就是Any

# 标注函数返回值
# Python中所有没有显示返回的函数,其返回值都是None,我们也要给 -> None
def get_info(user_id:Optional[int]) -> None:
    user = user_id
    user.save()

from typing import Optional, NoReturn
def get_info(user_id:Optional[int]) -> NoReturn:
    raise ValueError

组合

from dataclasses import dataclass
from pydantic import BaseModel, ValidationError

@dataclass
class Point:
    x: int
    y: int

class User(BaseModel):
    id: int
    name: str
    age: int

def create_user(id: int, name: str, age: int) -> User:
    return User(id=id, name=name, age=age)

try:
    user = create_user(123, 'Alice', 30)
    print(user)
except ValidationError as e:
    print(e.json())

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区