attrs是一个减少样板的有用软件包。例:
class SomeClass(object):
a_number = attr.ib(default=42)
list2_of_numbers = attr.ib(default=attr.Factory(list))
PyCharm不为生成的__init__
方法提供代码完成,是否有插件可以执行此操作?还是其他一些工作?
更新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(),你需要记住手动更新__init__
签名,这与attrs的哲学是对立的。
仅供参考2017年3月发布的今年早些时候的Jonas Obrist tweeted one of the Jetbrains Devs关于attrs的支持,所以手指交叉......
编辑
实际上,有一个更可口的解决方法。只需将init=False
传递给attr.s
并像往常一样定义你的__init__
方法。你仍然没有充分利用激光的全部魔力,但是嘿......它总比没有好。
请注意在手册__init__
中初始化您的默认值,而不是针对该类的attr.ib声明。根据the docs,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年初)在这方面有一些有趣的发展:
__init__
和cmp
特殊方法的支持)attrs
是python 3.7标准库中的一个新模块,受到qazxswpoi的启发预计未来几个月内将解决其中一些问题。希望所有人!