【问题标题】:how to explain domain specific constraints to mypy如何向 mypy 解释特定领域的约束
【发布时间】:2018-10-27 22:49:10
【问题描述】:

鉴于这个 sn-p:

from typing import Dict

def a(my_dict: Dict[str,int])->int:
    return my_dict.get('a') or my_dict.get('b')

我从领域知识中知道必须有 a 或 b 键,mypy 无法知道。因此我得到一个错误

错误:返回值类型不兼容(得到 Optional[int],期望 int)

我如何告诉 mypy 这个事实?

我的任务是添加到现有的 python 代码库类型提示,因此我不想更改代码,只是添加类型注释。

【问题讨论】:

    标签: python mypy


    【解决方案1】:

    dict.get(...) 方法的返回类型为Optional[ValueType]。真的没有办法解决这个事实。

    如果您知道对my_dict.get('b') 的调用将始终成功,则可以将其替换为my_dict['b'],其返回类型仅为ValueType。所以,做:

    from typing import Dict
    
    def a(my_dict: Dict[str, int]) -> int:
        return my_dict.get('a') or my_dict['b']
    

    Mypy 也理解断言(在某种程度上):

    from typing import Dict
    
    def a(my_dict: Dict[str, int]) -> int:
        ret_val = my_dict.get('a') or my_dict['b']
        assert ret_val is not None
        return ret_val
    

    或者,您可以添加强制转换以强制 mypy 假设您的表达式具有某种类型。但是,这将是最不安全的选项:您基本上覆盖了类型检查器认为正确的内容。如果您绝对确定演员会成功,这很好,但我认为更好的选择是重组您的代码或至少添加运行时检查,就像我们对上面的断言所做的那样。

    from typing import Dict, cast
    
    def a(my_dict: Dict[str, int]) -> int:
        return cast(int, my_dict.get('a') or my_dict.get('b'))
    

    【讨论】:

      猜你喜欢
      • 2017-04-09
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多