Python 3.x 是否在实例化时设置了Python3.x字典lint类型检查(键入)
我有一个配置字典,在dunder init调用的层次结构中加载值,每个调用都实例化了配置的一部分。在尝试添加打字时,我收到了一个奇怪的行为(或者可能是我做错了什么)。我得到的行为与字典给出的仅在其第一次声明中插入的类型一致,更新、扩展和添加键似乎不会在访问字典时尽可能改变字典声明的类型,我编写了一个简单的代码来说明问题: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})
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]])
应为类型“Union[bytes,str,_Regex]”,改为“int”
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"))
因为这是一个配置字典,我不知道它包含什么,所以我想我将使用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"))