如何解决类型提示预期布尔值且始终为空列表
var
check = [] and True
print(check) # prints []
我只想在 check = [1] and True
print(check) # prints True
语句中使用 check
来检查变量的真实性,如下所示:
if
我应该像这样输入提示吗?
if check:
print('Passed')
我什至不知道这是否如何注释一个总是空的列表,但注释本身似乎很愚蠢,因为对读者来说,它只关心它的真实性。理想情况下,我只想要 from typing import Literal,Union
check: Union[Literal[True],Literal[[]]] = [] and True
,但该语句并不总是返回 check: bool = [] and True
,因此它似乎不正确。
还有这个选项可以把它变成bool
:
bool
或
check: bool = not not [] and True
但这些似乎是无缘无故的额外工作,因为我只需要真实性,无论我得到的是空列表还是check: bool = bool([]) and True
,都会获得真实性。
那么,如果语句本身不返回布尔值,那么注释仅在布尔上下文中解释语句的正确方法是什么?我只是将其转换为布尔值并使用 False
进行注释,还是使用诸如 bool
之类的东西?还有一个旁注,我不知道 Union[Literal[True],Literal[[]]]
是否是注释始终为空的列表的正确方法(或者是否可能)。
解决方法
我认为注释它的正确方法是使用 Union[List,bool]
但类型提示不会进行数据验证来检查列表是否为空 - 为此,请查看此 {{3} 中探索的 PyDantic }
from typing import List,Union
def check_list(my_list: Union[List,bool]):
if my_list:
print("got truth")
else:
print("got false")
,
核心 Python 允许动态类型。如果您知道只想在布尔上下文中使用 check
,请使用 bool 对其进行注释并使用 and True
。
check: bool
check = [] and True # will contain []
...
check = [1] and True # will contain True
当我在 PyCharm 中测试时,这不会发出警告。
您也可以使用:
check: bool = [] and True # will contain []
...
check: bool = [1] and True # will contain True
也没有发出警告...
,对我来说,这几乎感觉像是类型检查的固有不良候选人。在这种特定情况下,您实际上并不关心返回值的类型,只要您可以对其调用 bool
以测试其真实性。除非你使用 pandas
/numpy
或类似的东西,否则很少有 python 对象你不能调用 bool
- 它不需要存在 {{1 }} 方法或任何东西 - 所以你不能使用通常的鸭子类型解决方案,即使用 __bool__
。 (例如,请参见 typing.Protocol
模块中的 SupportsInt
和 SupportsRound
类,它们都测试某些方法的存在。)
因此,我认为 typing
的提示与 typing.Any
等更详细的提示一样信息丰富且正确。在我看来,第二个中的额外信息对于您的目的来说完全是多余的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。