用于吸引人的Pycharm插件?

时间:2017-06-21 09:42:49

标签: python pycharm

attrs是一个用于减少样板的有用软件包。例如:

ORD-19-000

PyCharm不为生成的class SomeClass(object): a_number = attr.ib(default=42) list2_of_numbers = attr.ib(default=attr.Factory(list)) 方法提供代码完成,是否有可以执行此操作的插件?或者其他一些工作?

3 个答案:

答案 0 :(得分:5)

2018年8月更新 - 根据Hynek's Answer,attrs支持位于PyCharm 2018.2。我已经迟到了一个月,因为我最近一直在用Python工作......

我的原始答案如下,但它仅适用于PyCharm 2018.1或更低版本...

我所知道的唯一解决方法(截至PyCharm 2017.2.4)是在类声明中定义冗余__init__。 PyCharm的代码完成确定了这个方法,但是在运行时,attrs生成的__init__将覆盖它。例如(使用type hints):

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 code completion screen shot

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

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

如果您添加,删除或修改attr.ib(),您需要记住手动更新与{00}对齐的__init__签名。理念。

仅供参考,Jonas Obrist tweeted one of the Jetbrains Devs关于今年早些时候关于2017.3版本的支持,所以手指交叉......

修改

实际上,有一个略微更可口的解决方法。只需将init=False传递给attr.s,然后像往常一样定义__init__方法。你仍然没有利用attrs的完整魔法,但是嘿......它总比没有好。

注意初始化手册__init__中的默认值,而不是针对类的attr.ib声明。根据{{​​3}},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)

答案 1 :(得分:3)

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

答案 2 :(得分:1)

最近(早期' 18)在这方面有一些有趣的发展:

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