微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

类型提示预期布尔值且始终为空列表

如何解决类型提示预期布尔值且始终为空列表

我有一个列表,我只需要检查它是否为空。

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 模块中的 SupportsIntSupportsRound 类,它们都测试某些方法的存在。)

因此,我认为 typing 的提示与 typing.Any 等更详细的提示一样信息丰富且正确。在我看来,第二个中的额外信息对于您的目的来说完全是多余的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?