【问题标题】:Pycharm plugin for attrs?用于 attrs 的 Pycharm 插件?
【发布时间】:2017-11-24 03:26:19
【问题描述】:

attrs 是一个用于减少样板代码的有用包。示例:

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

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

【问题讨论】:

  • 在运行时开启代码检查或添加类型注解。
  • @jakob-bowyer 运行时的代码检查在这里有何帮助?对我来说,缺少 pycharm 代码完成是我不使用 attrs 的原因。
  • 因为你的代码第一次执行的时候就填写了代码补全。
  • 我为 attrs 支持创建了票证:youtrack.jetbrains.com/issue/PY-26354
  • 任何有兴趣的人,请去jetbrains票并点击选民。 :D

标签: python pycharm


【解决方案1】:

2018 年 8 月更新 - 根据 Hynek's AnswerPyCharm 2018.2 提供 attrs 支持。我迟到了一个月,因为我最近没有在 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(),您需要记住手动更新与 attrs 理念相反的 __init__ 签名。

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

编辑

实际上,有一个稍微更可口的解决方法。只需将init=False 传递给attr.s 并像往常一样定义您的__init__ 方法。您仍然没有充分利用 attrs 的 full 魔力,但是嘿……总比没有好。

注意在您的手册__init__ 中初始化您的默认值,而不是针对该类的 attr.ib 声明。根据the docs,attr.ib 的默认值只会在 attrs 生成的__init__ 内初始化。

除此之外,据我所知,您仍然可以获得其他笨拙的方法、验证和所有其他优点。

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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 任何细节或来源?我只是在生成的__init__ 调用中收到“意外参数”警告。
    【解决方案3】:

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

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

    【讨论】:

    • 属性支持包含在 Pycharm 2018.2 中,即将发布。 :P
    猜你喜欢
    • 2019-02-20
    • 2021-08-14
    • 2017-05-04
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    相关资源
    最近更新 更多