如何“投射” Python类型提示

时间:2018-10-09 00:20:01

标签: python types

我有一个客户端库,该库具有如下功能

def connect(timeout: float):

但是,该客户端的文档指出,如果未指定timeout或“无”,它将有效地使用默认超时。我已经测试了这种情况,并且可以正常地为None指定timeout的值

然后,我的代码用以下内容包装此connect方法:

def my_connect(timeout: float = None):
    connect(timeout=timeout)

当我对它运行mypy以验证类型提示时,它抱怨:timeout的参数connect期望float但得到Optional[float]

基于在{{1}中使用默认值connect,我宁愿不必在代码中包含其他逻辑来更改调用None方法的方式}方法,因为那将需要附加的单元测试,而我首先需要超时的全部原因是因为单元测试将在没有负测试用例的情况下在没有超时的情况下阻塞。

推荐的处理方式是什么?即使库创建者明确指定了一个非可选的float,是否有某种方法可以强制接受该参数?该库是专有的并且仅二进制文件,因此我没有能力更改签名,并且我真的很想尝试在不更改任何功能逻辑的情况下进行此工作,仅更改类型提示。

1 个答案:

答案 0 :(得分:0)

我已经为此实现了一个解决方案,该方案似乎可以通过所有检查,并且在功能上等效。

同样,库签名是

def connect(timeout: float):

包装纸是:

def my_connect(timeout: float = None):

事实证明,如果缺少值或connect,则socket._GLOBAL_DEFAULT_TIMEOUT方法默认为None。在文档中这是正确的,而我只是错过了。

解决方案是简单地将包装器上的默认值更改为使用相同的socket._GLOBAL_DEFAULT_TIMEOUT而不是None。

例如

import socket
...
def my_connect(timeout: float = socket._GLOBAL_DEFAULT_TIMEOUT):

这将导致隐式类型提示,如果未明确将值float转换为Optional[float],则将None转换为float,从而正确地将参数键入为window.location.href 。这样可以完全通过类型提示检查。