跳至主要內容

符号

Entity大约 4 分钟

符号

在 Python 中,在函数调用或数据结构中使用 **...(省略号)、*(星号)、**(双星号)** 有不同的作用,具体如下:


1. ...(省略号 Ellipsis)

作用:表示 省略(Ellipsis),常用于 NumPy、占位符、类型注解等。

示例 1:NumPy 切片

import numpy as np

arr = np.random.rand(3, 4, 5)

# 使用 `...` 选择所有前两维的元素
print(arr[..., 0].shape)  # (3, 4)

示例 2:作为占位符

def my_function():
    ...  # 这里可以先不写代码,相当于 pass

示例 3:类型注解

from typing import Callable

def func(x: int, y: int) -> ...:  # 表示返回值未确定
    return x + y

2. *(单星号)

作用

  • 解包(Unpacking):用于列表、元组、参数等的解包
  • 变长参数:用于函数参数,使其接受多个位置参数

示例 1:列表解包

a = [1, 2, 3]
print(*a)  # 1 2 3

示例 2:变长参数

def add(*args):
    return sum(args)

print(add(1, 2, 3))  # 6

**3. **(双星号)**

作用

  • 字典解包:用于字典的键值对解包
  • 关键字参数:用于函数参数,使其接受多个键值对

示例 1:字典解包

dict1 = {"x": 1, "y": 2}
dict2 = {"z": 3, **dict1}  # 合并字典
print(dict2)  # {'z': 3, 'x': 1, 'y': 2}

示例 2:关键字参数

def person_info(**kwargs):
    print(kwargs)

person_info(name="Alice", age=25)
# 输出:{'name': 'Alice', 'age': 25}

4. [:]数组切片

在 Python 中,中括号中的冒号(:)用于切片操作。具体来说,dirs[:]表示对列表 dirs 进行切片操作,生成一个新的列表,该列表包含 dirs 中的所有元素。

在 Python 中,切片操作是一种强大的工具,可以用于提取、修改和操作序列(如列表、字符串、元组等)。以下是切片的所有常见用法:

  1. 基本切片

    numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    subset = numbers[2:7]
    print(subset)  # 输出: [2, 3, 4, 5, 6]
    
  2. 省略开始或结束索引

    start_to_five = numbers[:5]
    print(start_to_five)  # 输出: [0, 1, 2, 3, 4]
    
    five_to_end = numbers[5:]
    print(five_to_end)  # 输出: [5, 6, 7, 8, 9]
    
  3. 使用负数索引

    last_three = numbers[-3:]
    print(last_three)  # 输出: [7, 8, 9]
    
    exclude_last_two = numbers[:-2]
    print(exclude_last_two)  # 输出: [0, 1, 2, 3, 4, 5, 6, 7]
    
  4. 步长

    every_second = numbers[::2]
    print(every_second)  # 输出: [0, 2, 4, 6, 8]
    
    reverse = numbers[::-1]
    print(reverse)  # 输出: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    
  5. 修改列表中的元素

    numbers[2:5] = [20, 30, 40]
    print(numbers)  # 输出: [0, 1, 20, 30, 40, 5, 6, 7, 8, 9]
    
  6. 删除列表中的元素

    numbers[2:5] = []
    print(numbers)  # 输出: [0, 1, 5, 6, 7, 8, 9]
    
  7. 字符串切片

    text = "Hello, World!"
    substring = text[7:12]
    print(substring)  # 输出: "World"
    
  8. 元组切片

    tuple_example = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
    subset_tuple = tuple_example[2:7]
    print(subset_tuple)  # 输出: (2, 3, 4, 5, 6)
    

总结

符号作用典型用途
...省略号占位符、NumPy 切片、类型注解
*解包、可变参数列表/元组解包、变长参数
**字典解包、关键字参数字典解包、函数关键字参数
[:]切片用于数组切片

在 pydantic 中使用省略号

Pydantic 中,Field(...) 使用省略号 ...(Ellipsis),表示该字段是必填的,不能省略或为空。


📌 省略号 ... 在 Pydantic Field 中的作用

在 Pydantic 的 Field() 里,... 表示该字段 没有默认值,必须由用户提供,否则会报错。

✅ 示例 1:必填字段

from pydantic import BaseModel, Field
from typing import List

class UserModel(BaseModel):
    username: str = Field(..., description="用户名")  # 必填
    login_other: List[str] = Field(..., description="第三方登录")  # 必填

# ❌ 省略字段会报错
UserModel(username="Alice")
# pydantic.error_wrappers.ValidationError: missing field: login_other

📌 省略号 ...None、默认值的区别

语法作用是否必填
Field(...)强制必填(用户必须提供)✅ 是
Field(None)可选字段,默认值为 None❌ 否
Field(default_value)有默认值,如果不传就用默认值❌ 否

✅ 示例 2:可选 vs 必填

class UserModel(BaseModel):
    required_field: str = Field(..., description="必须填写")
    optional_field: str = Field(None, description="可以为空")
    default_field: str = Field("default_value", description="默认值为 'default_value'")

UserModel(required_field="data")  # ✅ 成功
UserModel(optional_field="data")  # ✅ 成功
UserModel()  # ❌ 缺少 required_field,会报错

📌 为什么要用 ... 而不是 None

  • None 表示 可选字段,但 ... 强制要求用户提供值
  • ... None 更加严格,用于必须提供的字段。

📌 什么时候用 Field(...)

  • 如果一个字段必须由用户提供,用 Field(...)
  • 如果字段可以为空,用 Field(None)Optional[...]

你这个 login_other: List[str] = Field(...),说明:

  • 这个字段必须提供,否则 Pydantic 会报错。
  • 你可以在 description 里加上更详细的提示,方便文档生成。 😊