mypy - 如何将线标记为无法到达

问题描述 投票:0回答:3

我有以下形式的功能:

def get_new_file(prefix: str) -> pathlib.Path:
    for i in itertools.count(0):
        p = pathlib.Path(f'{prefix}_{i}')
        if not p.is_file():
            return p
    # This line is unreachable.

mypy 可以理解地抱怨函数缺少 return 语句。有没有办法标记一条线以通知 mypy 这条线应该被认为是不可达的?

python mypy
3个回答
8
投票

这是一个问题。推荐的解决方案是

assert False
.

def get_new_file(prefix: str) -> pathlib.Path:
    for i in itertools.count(0):
        p = pathlib.Path(f'{prefix}_{i}')
        if not p.is_file():
            return p
    assert False

1
投票

这又是一个典型的问题,应该保持简单。 Mypy 显然不知道循环在哪里结束,所以它会提前警告你,因为函数的 endofline 语句没有 return 语句。

一个简单的方法是打破循环并返回上次设置的 pathlib.Path 的最后一个值。这是一个例子。

def get_new_file(prefix: str) -> pathlib.Path:
    p : Optional[pathlib.Path] = None 
    for i in itertools.count(0):
        p = pathlib.Path(f'{prefix}_{i}')
        if not p.is_file():
            break
    
    return p 

如果你重组上面的代码片段,mypy 将不会再次引发错误。


0
投票

Mypy 没有错,你不应该将该行标记为无法访问,而是引发错误,即使你确定你永远不会碰到该行,这是一个很好的编码习惯,你可以在以后节省一些调试时间

def get_new_file(prefix: str) -> pathlib.Path:
    for i in itertools.count(0):
        p = pathlib.Path(f'{prefix}_{i}')
        if not p.is_file():
            return p
    raise Exception # pick a meaningful exception

您也可以考虑将其更改为 while 循环。

def get_new_file(prefix: str) -> pathlib.Path:
    i = 0
    p = pathlib.Path(f'{prefix}_{i}')
    while not p.is_file():
        i += 1
        p = pathlib.Path(f'{prefix}_{i}')
    return p

有点重复,因为 python 没有“do while”但是完成了工作

© www.soinside.com 2019 - 2024. All rights reserved.