至少有 x 种类型的元组类型

问题描述 投票:0回答:1

基于 Python Typing 的文档,这些是处理元组的文档......

  • Tuple[()]
    - 空元组
  • Tuple[int, int]
    - 两个 int 对象的元组
  • Tuple[int, ...]
    - 任意数量的 int 对象的元组

我想创建一个类型,其中

Tuple
至少有 8 个
int
我的目标介于最后两种类型之间(
Tuple[int, int]
Tuple[int, ...]
)。

如果元组有...

  • 8 个整数?好
  • 9 个整数?好
  • 32 个整数?好
  • 4 个整数?不好
  • 1 个整数?不好

这是否有可能 PyCharm 不会发出警告?这是我在下面尝试的。但是,PyCharm 会“错误地”向我发出有关

assert
声明

的警告
# Type Alias 
Byte = Tuple[int, int, int, int, int, int, int, int]           # 8 bits
Nibble = Tuple[int, int, int, int]                             # 4 bits

# BytePlus Type is not correct. The following code does not work
BytePlus = Tuple[int, int, int, int, int, int, int, int, ...]  # 8+ bits


def adder(byte1: Union[Byte, BytePlus], byte2: Byte) -> Byte:
    pass

# Incorrect warnings for parameters. 
# What I see...
#    - parameter 1 (Byte | BytePlus) has no warning, but it should. nibble = 4 bits
#    - parameter 2 (Byte) has a warning, good, but it will have a warning for 9 bits
assert adder(nibble(4), nibble(10)) == byte(14)

如果您愿意,这里是

nibble()
byte()
的代码...

def byte(number) -> Byte:
    return (
        (number & 128) // 128,
        (number & 64) // 64,
        (number & 32) // 32,
        (number & 16) // 16,
        (number & 8) // 8,
        (number & 4) // 4,
        (number & 2) // 2,
        (number & 1) // 1
    )


def nibble(number) -> Nibble:
    return (
        (number & 8) // 8,
        (number & 4) // 4,
        (number & 2) // 2,
        (number & 1) // 1
    )
python python-3.x types tuples
1个回答
0
投票

PEP 646,引入了可变参数泛型,还允许元组类型被解包

TripleInt: TypeAlias = tuple[int, *tuple[int, int]]
# TripleInt = tuple[int, int, int]

由于

tuple[int, ...]
表示具有 0 个或多个
int
元素的元组,因此至少由 8 个
int
元素组成的元组的类型为:

Byte: TypeAlias = tuple[
    int, int, int, int, int, int, int, int,  # 8 `int`
    *tuple[int, ...]
]

对于 3.10 及更早版本,应使用

typing.Unpack
,因为加星号的表达式会导致
SyntaxError
,否则:

Byte: TypeAlias = tuple[
    int, int, int, int, int, int, int, int,  # 8 `int`
    Unpack[tuple[int, ...]]
]
© www.soinside.com 2019 - 2024. All rights reserved.