Python +;(“str”和“None”)
我正试着了解类型检查,我不明白为什么mypy在这里抱怨:Python +;(“str”和“None”),python,Python,我正试着了解类型检查,我不明白为什么mypy在这里抱怨: import typing as t import os env_var_1 = os.environ.get("env_var_1") env_var_2 = os.environ.get("env_var_2") some_string = "blah" if not all([env_var_1, env_var_2]): raise ValueError(&q
import typing as t
import os
env_var_1 = os.environ.get("env_var_1")
env_var_2 = os.environ.get("env_var_2")
some_string = "blah"
if not all([env_var_1, env_var_2]):
raise ValueError("Missing Vars")
print(type(env_var_1))
print(type(env_var_2))
print(env_var_1)
print(env_var_2)
def type_test(env_var_1: t.Optional[str], env_var_2: t.Optional[str]) -> None:
print(some_string + env_var_1, env_var_2)
type_test(env_var_1, env_var_2)
代码运行正常,以下是输出:
<class 'str'>
<class 'str'>
ABC
XYZ
blahABC XYZ
这个错误对我来说没有意义,因为类型不是“None”,而是字符串。。。我错过了什么?这样做让mypy很开心。。。不确定这是否是一个好方法
import typing as t
import os
env_var_1 = os.environ.get("env_var_1","") ##change here
env_var_2 = os.environ.get("env_var_2","") ##change here
some_string = "blah"
if not all([env_var_1, env_var_2]):
raise ValueError("Missing Vars")
def type_test(some_string: str, env_var_1: str) -> None:
print(some_string + env_var_1, env_var_2)
type_test(some_string, env_var_1)
添加不处理env_var_1为None的情况(例如,如果未在环境变量中定义它),因为
env_var_1
和env_var_2
都可以是None
。如果其中一个(或两个)都不是,那么您的代码将出错,mypy正确地捕捉到了这一点。你必须处理这些情况。如果你不知道,类型Optional[str]
与类型Union[str,None]
相同。因此,其他评论;您已经告诉mypy类型可能是None
。对,这就是为什么我要在代码前面检查(如果不是全部的话)
。@Nathan啊,我明白了,这是有道理的。那么我应该在这里做些什么来让mypy开心呢?
import typing as t
import os
env_var_1 = os.environ.get("env_var_1","") ##change here
env_var_2 = os.environ.get("env_var_2","") ##change here
some_string = "blah"
if not all([env_var_1, env_var_2]):
raise ValueError("Missing Vars")
def type_test(some_string: str, env_var_1: str) -> None:
print(some_string + env_var_1, env_var_2)
type_test(some_string, env_var_1)