基于 Python Typing 的文档,这些是处理元组的文档......
Tuple[()]
- 空元组Tuple[int, int]
- 两个 int 对象的元组Tuple[int, ...]
- 任意数量的 int 对象的元组我想创建一个类型,其中
Tuple
至少有 8 个 int
。
我的目标介于最后两种类型之间(Tuple[int, int]
和Tuple[int, ...]
)。
如果元组有...
这是否有可能 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
)
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, ...]]
]