PyCharm警告和预期类型:何时关注?

时间:2018-03-07 17:24:14

标签: python pycharm

有很多关于PyCharm和警告的帖子和问题,但是关于PyCharm何时实际告诉你一些有用的东西以及什么时候没有,特别是关于“预期类型”警告似乎很少有共识。我发现,发布到IntelliJ / PyCharm支持板通常不会提供太多的路线图。

所以我保持这个问题的标题有点通用但我会提供一个非常具体的例子,有两个不同的警告,其中修复一个会导致执行错误。我希望这类警告可能有一个普遍的答案。也许答案只是PyCharm不太擅长这种检测。

上下文

请在此处考虑以下代码:

def load_agent(pacman, no_graphics):
  python_path_string = os.path.expandvars("$PYTHONPATH")

  if python_path_string.find(';') == -1:
    python_path_dirs = python_path_string.split(':')
  else:
    python_path_dirs = python_path_string.split(';')

  python_path_dirs.append('.')

  for module_dir in python_path_dirs:
    if not os.path.isdir(module_dir):
        continue

    module_names = [f for f in os.listdir(module_dir) if f.startswith('agents_')]

我的for block中有更多代码,但这与此处的问题无关。我还会说我的代码 工作。但我担心的是我是否应该忽略有关类型的警告。

问题

我将从最后一行开始。如果您尝试对Python REPL中传递startswith()的内容做任何奇怪的事情,您会被告知:

startswith first arg must be str or a tuple of str, not bytes

有道理。那么为什么PyCharm会对这一行说出以下内容('agents_'参数,特别是:

Expected type 'Union[bytes, Tuple[bytes, ...]], got 'str' instead

此外,上面的第9行(python_path_dirs.append('.'))也提供了一个PyCharm警告(特别是'。'):

Expected type 'bytes' (matched generic type '_T'), got 'str' instead

解决方案尝试

对于第9行的问题,我知道我可以在字符串前加b。但这样做会导致其他问题。具体来说,它会导致最后一行执行问题(我最初提到的那个)。

所以要明确:上面的代码,按原样,工作正常。如果我假设PyCharm正确地警告我,我修复了第9行,看起来像这样:

python_path_dirs.append(b'.')

这是IntelliJ / PyCharm团队提供的建议,我也看到了其他一些StackOverflow答案。

但是,这样做会导致上面代码中的最后一行失败并出现此错误:

TypeError: startswith first arg must be bytes or a tuple of bytes, not str

让我冲突

所以我担心的是,两条线似乎“连接”,因为它们都会收到警告。并且尝试满足第一个警告会导致第二行中的执行错误。然而,警告显然是不同类型的。此外,最后一行的警告似乎与Python本身所说的startswith()的参数相矛盾。

我意识到答案可能是:“如果您的代码有效,那么问题是什么?”但部分问题是我想要相信我用于开发的工具。如果我开始关闭警告或假设一切都很好,与工具相反,我也可以不使用该工具。

1 个答案:

答案 0 :(得分:1)

我不适用于Jet Brains,但我已经使用Resharper和PyCharm多年了。以下是我对该主题的一般经验/想法(特别是对于Pycharm)。

直到最近,由于类型提示3.5+的可用性,PyCharm必须做出一些非常聪明的推断,以提供类型检查和自动完成等功能。考虑到它确实是一个非常好的工作 - 但通常它最好的猜测是不正确的。最终,有时只有开发人员可以决定它是否只是猜错了。

如果你像我一样,你不能忍受看到那些卷曲的线条告诉你代码味道。幸运的是,PyCharm让你能够关闭一行,一个函数,甚至一个文件的警告(例如#noinspection PyTypeChecker - 在你的情况下)。当我知道PyCharm给我错误的警告时,我依赖那些。有时我完全不同意PyCharm并调整整个项目的检查。

现在,通过类型提示,这应该会更好(提供开发人员使用它)。 PyCharm将有更可靠的信息来做出决定。好消息是你可以提供帮助。

  1. 确保对所有个人项目使用类型提示
  2. 鼓励与您合作的其他人做同样的事情
  3. 请积极鼓励软件包维护人员做同样的事情
  4. 通过添加类型提示
  5. 来提供对项目的贡献

    如果每个开发人员都做到了以上情况,那么大多数虚假警告都会消失。在那之前,所有人都没有神奇的答案。您只需根据具体情况处理警告。