Pycharm 插件用于吸引?



attrs 是减少样板的有用软件包。例:

class SomeClass(object):
a_number = attr.ib(default=42)
list2_of_numbers = attr.ib(default=attr.Factory(list))

PyCharm 没有为生成的__init__方法提供代码补全,有没有插件可以做到这一点?还是其他解决方法?

2018 年 8 月更新- 根据海尼克的回答,attrs 支持在 PyCharm 2018.2 中。我迟到了一个月,因为我最近不太用 Python 工作......

我最初的答案如下,尽管它仅适用于您使用 PyCharm 2018.1 或更低版本的情况......


我知道的唯一解决方法(从 PyCharm 2017.2.4 开始)是在类声明中定义冗余__init__。PyCharm的代码完成可以很好地选择此方法,但在运行时,attrs生成的__init__将覆盖它。例如(带有类型提示):

import attr
from typing import List, Optional

@attr.s
class SomeClass:
def __init__(self, a_number: int = 42,
list2_of_numbers : Optional[List[int]] = None) -> None:
...
a_number: int = attr.ib(default=42)
list2_of_numbers: List[int] = attr.ib(default=attr.Factory(list))

PyCharm 代码完成屏幕截图

我还尝试使用存根文件从类声明中删除虚拟__init__,以期删除 .pyi 如果支持,但它不起作用。

当然,这种方式首先违背了使用 attrs 的目的(即减少类声明样板、帮助可维护性等)。

如果您添加、删除或修改 attr.ib(),您需要记住手动更新__init__签名,这与 attrs 的理念背道而驰。

仅供参考,乔纳斯·奥布里斯特(Jonas Obrist)在今年早些时候发布了一位关于2017.3版本的attrs支持的Jetbrains Devs,因此手指交叉...

编辑

实际上,有一个稍微可口解决方法。只需将init=False传递给attr.s并像往常一样定义__init__方法即可。你仍然没有利用吸引力的全部魔力,但是嘿......总比没有好。

请注意在手动__init__中初始化默认值,而不是针对类的 attr.ib 声明。根据文档,attr.ib 的默认值只会在 attrs 生成的__init__中初始化。

除此之外,据我所知,您仍然可以获得其他 dunder 方法、验证和所有其他好处。

import attr
from typing import List, Optional

@attr.s(init=False)
class SomeClass:
a_number: int = attr.ib()
list2_of_numbers: List[int] = attr.ib()
def __init__(self, a_number: int = 42,
list2_of_numbers : Optional[List[int]] = None) -> None:
self.a_number: int = a_number
self.list2_of_numbers: List[int] = list2_of_numbers or []
# Replicate behaviour of attrs-generated __init__
attr.validate(self)

好消息:PyCharm 2018.2 增加了对 attrs 的支持。

最近(18年初)在这方面有一些有趣的发展:

  • 一个 attrs PR 来添加 PEP 484 存根,这些存根被 PyCharm 识别(但不添加对__init__的支持,以及cmp特殊方法)
  • 一个 python 类型化的 PR,用于将这些存根添加到官方第三方集合中
  • 一个 mypy PR 添加对 attrs 特殊方法的支持
  • 将此功能添加到 PyCharm(如上所述)的票证获得了很多选票(添加您的!
  • PyCharm 2018.1 EAP2增加了对dataclasses的支持,这是python 3.7标准库中的一个新模块,很大程度上受到attrs

预计其中一些问题将在未来几个月内得到解决。希望他们所有人!

最新更新