`mypy`不允许解压

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

考虑以下因素

from datetime import datetime

def tle_request(date_time: list[int]) -> datetime:
    # Attempting to create a datetime object using unpacking
    general_date: datetime = datetime(date_time[0], date_time[1], date_time[2])  # This causes a mypy error
    return general_date

# Example usage
my_time = tle_request([2023, 9, 27])
print(f"Hello {my_time}")

虽然它有效:

❯ python main.py
Hello 2023-09-27 00:00:00

mypy
提示如下错误:

❯ mypy main.py
main.py:5: error: Argument 1 to "datetime" has incompatible type "*list[int]"; expected "tzinfo | None"  [arg-type]
Found 1 error in 1 file (checked 1 source file)

这很奇怪,因为如果我用

datetime(*date_time[:3])
更改
datetime(date_time[0], date_time[1], date_time[2])
。我工作:

❯ mypy main.py
Success: no issues found in 1 source file

为什么?拆包确实是必要的,我认为

mypy
没有理由抱怨它。

python mypy argument-unpacking
1个回答
1
投票

看看

datetime.datetime.__new__
的签名:

    def __new__(
        cls,
        year: SupportsIndex,
        month: SupportsIndex,
        day: SupportsIndex,
        hour: SupportsIndex = ...,
        minute: SupportsIndex = ...,
        second: SupportsIndex = ...,
        microsecond: SupportsIndex = ...,
        tzinfo: _TzInfo | None = ...,  # Expected "tzinfo | None"
        *,
        fold: int = ...,
    ) -> Self: ...

mypy 不知道

list[int]
的大小,因此在这种情况下最好的猜测是用
__new__
填充
int
的所有参数。
__new__
的最后一个位置参数不允许是
int
,这是 mypy 警告您的。

在此处使用

list[int]
进行解包操作根本无法用于静态类型目的 - 如果您想使用解包,请使用
tuple
:

def tle_request(date_time: tuple[int, int, int]) -> datetime: ...
© www.soinside.com 2019 - 2024. All rights reserved.