Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 是否在实例化时设置了Python3.x字典lint类型检查(键入)_Python 3.x_Pycharm_Lint_Typing - Fatal编程技术网

Python 3.x 是否在实例化时设置了Python3.x字典lint类型检查(键入)

Python 3.x 是否在实例化时设置了Python3.x字典lint类型检查(键入),python-3.x,pycharm,lint,typing,Python 3.x,Pycharm,Lint,Typing,我有一个配置字典,在dunder init调用的层次结构中加载值,每个调用都实例化了配置的一部分。在尝试添加打字时,我收到了一个奇怪的行为(或者可能是我做错了什么)。我得到的行为与字典给出的仅在其第一次声明中插入的类型一致,更新、扩展和添加键似乎不会在访问字典时尽可能改变字典声明的类型,我编写了一个简单的代码来说明问题: import re def foo(a: int = 1, b: str = "b"): d = {"a": a} d.update({"b": b})

我有一个配置字典,在dunder init调用的层次结构中加载值,每个调用都实例化了配置的一部分。在尝试添加打字时,我收到了一个奇怪的行为(或者可能是我做错了什么)。我得到的行为与字典给出的仅在其第一次声明中插入的类型一致,更新、扩展和添加键似乎不会在访问字典时尽可能改变字典声明的类型,我编写了一个简单的代码来说明问题:

import re


def foo(a: int = 1, b: str = "b"):
    d = {"a": a}
    d.update({"b": b})
    print(re.findall(d["b"], "baba"))


foo()
代码当然可以工作并输出
['b','b']
(并非双关语),但my pycharm给出了两个警告:

  • 在更新行:
    意外类型:
    (Dict[str,str])
    可能的类型:
    (Mapping[str,int])
    (Iterable[Tuple[str,int]])
  • 在finditer行上:
    应为类型“Union[bytes,str,_Regex]”,改为“int”
  • 我的问题是,我对原因的分析是真的吗(dict将其类型设置为实例化)?有没有一种类似蟒蛇的方法来修复这些警告

    更新、扩展和添加键似乎不会改变字典声明的类型

    这是故意的。如果您将某个变量声明为类型
    Dict[str,int]
    ,那么如果您不小心尝试运行类似
    var['foo']='bar'
    的代码,您可能希望mypy大声抱怨

    在这种情况下,由于您将
    d
    分配给int的一个dict字符串,mypy假定您的意思是该类型仅为
    dict[str,int]

    如果希望代码进行类型检查,可以使用以下几种选项:

  • 显式声明您期望字典值的类型,并使用断言或强制转换来确认某些键的类型是您期望的类型:

    def foo(a: int = 1, b: str = "b") -> None:
        d: Dict[str, Union[int, str]] = {"a": a}
        d.update({"b": b})
    
        # If you want to check your assumption at runtime
        b_regex = d["b"]
        assert isinstance(b_regex, str)
        print(re.findall(b_regex, "baba"))
    
        # If you don't want/don't need to check the type
        print(re.findall(cast(str, d["b"]), "baba"))
    
  • 放弃静态键入dict,并将值设置为:

  • 使用指示dict将仅包含某些字符串键,其中每个键都有某个特定类型的对应值

    请注意,这目前是一个仅限mypy的扩展,尽管有计划在不久的将来将其作为一个成熟的类型添加到PEP 484中。一旦发生这种情况,PyCharm实际上有义务理解TypedAct(尽管他们可能已经提前添加了支持,但不确定)


  • 因为这是一个配置字典,我不知道它包含什么,所以我想我将使用2更新,以更新自2018年以来支持的集合文字。1。您使用的PyCharm版本是什么?2017.3:(,但谢谢!
    def foo(a: int = 1, b: str = "b") -> None:
        d: Dict[str, Any] = {"a": a}
        d.update({"b": b})
        print(re.findall(d["b"], "baba"))