用于吸引人的Pycharm插件?

Mor*_*oth 9 python pycharm

attrs是减少样板的有用方法.例:

class SomeClass(object):
    a_number = attr.ib(default=42)
    list2_of_numbers = attr.ib(default=attr.Factory(list))
Run Code Online (Sandbox Code Playgroud)

PyCharm不为生成的__init__方法提供代码完成,是否有插件可以执行此操作?还是其他一些工作?

chr*_*voy 5

更新20188月 - 根据Hynek的答案,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))
Run Code Online (Sandbox Code Playgroud)

PyCharm代码完成屏幕截图

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

当然,这种方式首先打败了使用attrs的目的(即减少类声明样板,帮助维护等)

如果你添加,删除或修改attr.ib(),你需要记住手动更新__init__签名,这与attrs的哲学是对立的.

仅供参考,乔纳斯·奥布里斯特在今年早些时候发布了关于2017年3月发布的关于激光支持的Jetbrains Devs之一,因此手指交叉......

编辑

其实,有一个稍微更可口的解决方法.只需像往常一样传递init=Falseattr.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)
Run Code Online (Sandbox Code Playgroud)