使用 mypy 进行类型检查,我无法弄清楚为什么会发生此错误[关闭]

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

所以,我从一开始就使用 mypy 学习如何使用类型检查在 python 中进行编码。我正在使用此代码来训练:

def stars(*args: int, **kwargs: float) -> None:
    
    for arg in args:
        print(arg)
    for key, value in kwargs:
        print(key, value)

stars(1.3,1.3)

我收到此打字错误:

learning_mypy.py:6: error: Unpacking a string is disallowed
learning_mypy.py:7: error: Cannot determine type of 'key'
learning_mypy.py:7: error: Cannot determine type of 'value'
learning_mypy.py:9: error: Argument 1 to "stars" has incompatible type "float"; expected "int"
learning_mypy.py:9: error: Argument 2 to "stars" has incompatible type "float"; expected "int"
Found 5 errors in 1 file (checked 1 source file)  

所以我的问题是:

  • 为什么会出现错误
    mypy.py:6
  • 如何定义
    key
    value
    的类型值?
  • 为什么会出现错误
    mypy.py:9
python python-typing mypy
1个回答
2
投票

如果您执行以下更改,mypy 不会显示任何内容。

def stars(*args: float, **kwargs: float) -> None:
    
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print(key, value)

stars(1.3,1.3)
  • 为什么会发生错误 mypy.py:6?

    for key, value in kwargs:
    对于这一行,您应该将 kwargs 视为 Python 字典。如果您在 for 循环中迭代
    kwargs
    ,它将仅迭代字典的键。看下面的代码。

    d = {'1': 'one', '2': 'two', '3': 'three'}
    for key in d:
        print(key)
    

    输出为:

    1
    2
    3
    

    如果你也想打印这些值,你可以使用

    dict.items
    方法。

    d = {'1': 'one', '2': 'two', '3': 'three'}
    for key, value in d.items():
        print(key, value)
    

    输出为:

    1 one
    2 two
    3 three
    

    或者,您可以通过字典访问键的值。

    for key in d:
        print(key, d[key])
    

    在第 6 行中,因为只生成了密钥,而且密钥也是

    str
    ;你正在尝试解压一个字符串。考虑下面的代码:

    var1, var2 = "test_variable"
    

    这正是第二个 for 循环的作用。

  • 如何定义键和值的类型?

    您无法定义

    kwargs
    的键类型,但可以定义值的类型。 (你已经做到了:
    kwargs: float

  • 为什么会出现错误 mypy.py:9?

    您将

    *args
    定义为
    int
    。但你通过了
    float
    。 如果你改变
    *args: float
    ,这个错误就会消失。

© www.soinside.com 2019 - 2024. All rights reserved.