首页 > 编程问答 >在 Python 中动态定义文字字符串排列的并集

在 Python 中动态定义文字字符串排列的并集

时间:2024-07-25 14:50:18浏览次数:15  
标签:python python-typing pyright

我有一个字符串列表:

strings = ['a','b','c']

我想声明列表中所有可能的有序对的 Union 类型。硬编码,这看起来像: Literal 我如何动态定义

CustomType = Literal[
  'ab', 'ac', 'aa',
  'ba', 'bb', 'bc',
  'ca', 'cb', 'cc'
]

这样我就不必手动放置每个组合? CustomType 我正在考虑以下内容:

但这给出了我的错误:

CustomType = Literal[*permutations(strings)]

激发这个问题的目标是让 Pylance 检测我是否尝试传递不是该集合元素的字符串。

Unpack operator in subscript requires Python 3.11 or newer 
 Pylance
Unpacked arguments cannot be used in type argument lists 
 Pylance

The objective motivating this question is to have Pylance detect if I try passing a string that is not an element of that set.

def f(string: CustomType):
  ...

f('foo') # Pylance will complain
f('ba') # Pylance will permit

不能使用 Literal 动态创建文字字符串的并集,因为 Literal 需要在编译时明确知道文字值。但是,可以使用枚举或自定义类来实现类似的目标。

1. 使用枚举:

from enum import Enum

class CustomType(Enum):
    """所有字符串组合的枚举。"""
    aa = 'aa'
    ab = 'ab'
    ac = 'ac'
    ba = 'ba'
    bb = 'bb'
    bc = 'bc'
    ca = 'ca'
    cb = 'cb'
    cc = 'cc'

def f(string: CustomType):
    ...

f('foo')  # Pylance 会报错
f('ba')   # Pylance 会允许
f(CustomType.ba)  # 使用枚举成员

这将创建一个名为 CustomType 的枚举,其中包含所有可能的字符串组合。Pylance 将识别这些成员,并可以相应地进行类型检查。

2. 使用自定义类:

from typing import List

STRINGS = ['a', 'b', 'c']
VALID_COMBINATIONS = [''.join(pair) for pair in itertools.product(STRINGS, repeat=2)]

class CustomType:
    """表示有效字符串组合的类。"""
    def __init__(self, value: str):
        if value not in VALID_COMBINATIONS:
            raise ValueError(f"Invalid string combination: {value}")
        self.value = value

    def __eq__(self, other: object) -> bool:
        if isinstance(other, CustomType):
            return self.value == other.value
        return False

def f(string: CustomType):
    ...

f('foo')  # 会引发 ValueError
f('ba')   # 创建一个 CustomType 实例
f(CustomType('ba'))  # 显式创建 CustomType 实例

此方法定义了一个自定义类 CustomType ,该类在初始化时检查值是否在有效组合中。这提供了更严格的类型检查,并允许在传递无效值时引发自定义错误。

这两种方法都可以帮助实现所需的行为,并允许 Pylance 检测无效的字符串组合。选择最适合需求和编码风格的方法。

标签:python,python-typing,pyright
From: 74075558

相关文章

  • 关于 Python 中装饰器缓存的困惑
    我正在使用Python装饰器来实现函数的缓存。我了解缓存结果以提高性能的基本概念,但我正在努力解决如何处理不同的函数参数并确保底层数据更改时缓存更新。我已经实现了一个基本装饰器,它将函数结果存储在基于参数的字典。但是,此方法无法处理函数参数可能具有复杂结构(如嵌套列......
  • Python:__add__ 和 +,浮点数和整数的不同行为
    当将整数值添加到浮点值时,我意识到如果在浮点上调用该方法可以正常工作,例如:__add__但如果在整数上调用则不行:>>>n=2.0>>>m=1>>>n.__add__(m)3.0起初我认为|||只是对>>>m.__add__(n)NotImplemented和__add__类型的实现方式不同(例如f......
  • python中scrapy爬取数据get()与getall()区别
    在使用scrapy进行爬取数据的时候,有些时候需要爬取的是一段文本,或者一个div里面有很多内容,这时候我们就要使用到get()或者getall()来获取数据: get():是获取的满足条件的第一个数据。getall():是获取的满足条件的所有数据。scrapyget()getall()原理在Scrapy中,get(......
  • python—NumPy基础(3)
    文章目录算术函数算术函数的使用算术函数中out参数的使用mod()函数的使用统计函数power()函数的使用median()函数的使用mean()函数的使用函数的使用其他常用函数tile()和repeat()函数的使用roll()函数的使用resize()函数的使用replace()和put()函数的使savetxt()和lo......
  • Python爬虫:代理ip电商数据实战
    引言:数据访问管理引发的烦恼作为一名Python博主,爬虫技能对于获取和分析数据至关重要,经常爬一下,有益身心健康嘛。爬虫技术对很多人来说,不仅仅是一种工具,更像是一种艺术,帮助我们从互联网中,捕捉到有价值的信息。我经常就会用爬虫来爬取一些所需的数据,用来进行数据分析和模型训......
  • python科学计算:加速库numba —— 安装和试用
    安装(anaconda环境下)condainstallnumbaDemo代码:fromnumbaimportjitfromnumpyimportarangeimportnumpyimporttime@jitdefsum2d(arr):M,N=arr.shaperesult=0.0foriinrange(M):forjinrange(N):result+=a......
  • Python - Selenium抓取淘宝直播间评论(可使用无头模式)
    Python-Selenium抓取淘宝直播间评论(可使用无头模式)下面介绍如何使用python中的selenium简单抓取淘宝直播间实时评论。友情提醒,仅供学习交流使用,请勿用于非法用途!一、创建python项目1.在目录下新建main.py和venv虚拟环境:创建虚拟环境:python-mvenvvenv激活虚拟环......
  • 需要帮助来提取此 XML 节点 - Python 中的 Excel 连接字符串
    我有一个Python程序,打开Excel(XLSX)文件,并尝试查找<connection>节点。这是connections.xml文件中的完整XML。<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?><connectionsxmlns="http://schemas.op......
  • 【python】Python中采集Prometheus数据,进行数据分析和可视化展示
    ✨✨欢迎大家来到景天科技苑✨✨......
  • 使用python3拼接rgb.txt与depth.txt为associate.txt(适用于GCNV2_SLAM中TUM数据集的运
    这里以GCNV2_SLAM中TUM数据集的运行为例子:安装gnv2_slam可以参考:GCNv2_SLAM-CPU详细安装教程(ubuntu18.04)-CSDN博客首先下载数据集ComputerVisionGroup-DatasetDownload下载后通过该命令解压:tar-xvfrgbd_dataset_freiburg1_desk.tgz打开后,你可以发现:在该数据集......