PyCharm可以自动生成__eq __()和__hash __()实现吗?

时间:2015-05-20 15:22:52

标签: python intellij-idea pycharm

我是PyCharm新手,但是长期使用IntelliJ用户。在IntelliJ中,当您编写类定义时,IDE可以基于实例变量自动生成构造函数equals()方法和hashCode()方法。这不仅可以保存输入,还可以防止意外错误,并自动引入一些equals()hashCode()最佳做法。

我希望PyCharm可以做同样的事情,因为这些产品来自同一家公司。经过大量Google搜索和搜索文档后,我无法找到__eq__()__hash__()的任何内容。当然,Python实例变量没有明确指定,但我希望生成器可以遵循一个约定,例如提供所有__init()__参数作为潜在的实例变量。对于__init__(),我found something that will automatically add instance variable settings进入__init__(),但这种方法似乎比单独输入更麻烦,而且它甚至不会将实例变量作为参数添加到{{} 1}}签名。

我是否遗漏了文档中的任何内容,或者是否有可以执行此操作的插件?

更新:要清楚,我正在寻找能够生成这些方法的实际实现的东西。也就是说,如果我有一个名为__init__()的类,并且PyCharm知道我的类有Pointx个实例变量,那么它会自动为y方法生成这个:

__eq__()

在IntelliJ中可以轻松完成等效操作。

3 个答案:

答案 0 :(得分:6)

您可以创建Live Template

在文件 - >设置 - >编辑器 - >实时模板下 寻找Python 单击+添加,然后我将其命名为“class”,并确保在gui中为Python文件添加上下文。

模板文字:

class $class_name$:
    """$class_docstring$"""

    def __init__(self, $args$):
        """$init_docstring$"""
        pass

    def __eq__(self, $other$):
        if not isinstance($other$, $class_name$):
            return NotImplemented
        elif self is $other$:
            return True
        else:
            return self.$eq_field$ == $other$.$eq_field$

    def __hash__(self, ):
        pass
    $END$

我离开了我的“选项” - > “展开时”部分设置为“默认(Tab)” 在此之后,当您键入“class”时,可以使用Tab auto-complete插入实时模板。您的光标将被弹回到实时模板文本中作为变量包含的任何部分。

更复杂,即列表类型,LiveTemplate似乎不支持变量。例如,实时模板文本或列表扩展中的条件似乎不可用。

答案 1 :(得分:1)

选择class,然后执行以下操作之一:

  • Alt-Insert
  • Right Click -> Generate
  • Menu -> Code -> Generate

答案 2 :(得分:0)

也许您对数据类的概念也感兴趣?

https://docs.python.org/3/library/dataclasses.html

注解隐式生成默认方法。我知道这不是您问题的答案(因为实际上无法看到生成的代码),但可能有助于解释您提出问题的原因。