我试图理解如何使用Optional
类型提示。从PEP 434,我知道我可以使用Optional
作为def test(a: Union[int, None])
或def test(a: Optional[int])
。
但下面的例子怎么样?
def test(a : dict = None):
#print(a) ==> {'a': 1234}
#or
#print(a) ==> None
def test(a : list = None):
#print(a) ==> [1,2,3,4, 'a', 'b']
#or
#print(a) ==> None
Optional[type]
的意思似乎与Union[type, None]
相同,我为什么要使用Optional[]
?
Optional[...]
是Union[..., None]
的简写符号,告诉类型检查器需要特定类型的对象,或None
是必需的。...
表示任何有效的类型提示,包括复杂的复合类型或更多类型的Union[]
。当您有一个默认值为None
的关键字参数时,应该使用Optional
。因此对于您的两个示例,您有
dict
和list
容器类型,但是a
关键字参数的默认值表明None
也被允许,因此使用Optional[...]
:请注意,在
Union[]
上使用Optional[]
与在Union[]
中添加None
在技术上没有区别。所以Optional[Union[str, int]]
和Union[str, int, None]
是完全相同的。就我个人而言,在设置使用
= None
设置默认值的关键字参数的类型时,我会坚持使用Optional[]
始终使用^{,这说明了为什么更好地允许None
。此外,如果参数变为必需的,则更容易将Union[...]
部分移动到单独的类型别名中,或者以后删除Optional[...]
部分。例如,假设你有
然后通过将
Union[str, int]
拉出到类型别名中改进文档:将
Union[]
移动到别名中的重构变得更加容易,因为使用了Optional[...]
,而不是Union[str, int, None]
。None
值毕竟不是“子窗口小部件id”,它不是值的一部分,None
是用来标记缺少值的。附带说明:您希望避免在类型提示中使用标准库容器类型,因为您无法说明它们必须包含哪些类型;因此,使用
typing.List
和typing.Dict
代替dict
和list
。当只从容器类型中读取时,也可以接受任何不可变的抽象容器类型;列表和元组是Sequence
对象,而dict
是Mapping
类型:相关问题 更多 >
编程相关推荐