python - PyCharm 能否自动生成 __eq__() 和 __hash__() 实现?

标签 python intellij-idea pycharm

我是 PyCharm 的新手,但却是 IntelliJ 的长期用户。在 IntelliJ 中,当您编写类定义时,IDE 可以根据实例变量自动生成构造函数、equals() 方法和 hashCode() 方法。这不仅有利于节省键入时间,而且有助于防止无意中的错误以及自动引入一些 equals()hashCode() 最佳实践。

鉴于产品来自同一家公司,我希望 PyCharm 也能做到这一点。在对文档进行大量谷歌搜索和搜索之后,我找不到任何关于 __eq__()__hash__() 的内容。诚然,Python 实例变量没有明确指定,但我希望生成器可以遵循一个约定,比如提供所有 __init()__ 参数作为潜在的实例变量。至于__init__(),我found something that will automatically add instance variable settings__init__() 中,但这种方法似乎比直接键入更麻烦,而且它甚至没有将实例变量作为参数添加到 __init__() 签名中。

我是否遗漏了文档中的任何内容,或者也许有一个插件可以做到这一点?

更新:明确地说,我正在寻找能够生成这些方法的实际实现的东西。也就是说,如果我有一个名为 Point 的类,并且 PyCharm 知道我的类有 xy 实例变量,那么它会自动生成这个对于 __eq__() 方法:

def __eq__(self, other):
    if not isinstance(other, Point):
        return NotImplemented
    elif self is other:
        return True
    else:
        return self.x == other.x and self.y == other.y

等价物在 IntelliJ 中很容易完成。

最佳答案

您可以创建一个 Live Template

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

模板文本:

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$

我将“选项”->“扩展方式”部分设置为“默认(制表符)” 在此之后,当您键入“class”时,您可以使用 Tab 自动完成来插入实时模板。您的光标将跳到实时模板文本中作为变量包含的任何部分。

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

关于python - PyCharm 能否自动生成 __eq__() 和 __hash__() 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30353939/

相关文章:

Python 3.5 - Selenium - 如何处理新窗口并等待它完全加载?

java - 无法在Android Studio中添加组件

python - 如何在 Python 项目中关闭 Numba DEBUG 消息?

java - 有没有办法让 IntelliJ 回缩方法声明参数?

autocomplete - PyCharm - Gtk3 的自动完成功能神​​奇地停止工作

python - Pycharm Django Debugging 真的很慢

python - 获取用户列表以及组成员身份?

python - json序列化输出重音字符不正确,python/django

python - Pandas 一系列时间,必须转换为日期时间

java - 如何为 IntelliJ IDEA 中的所有项目设置默认项目位置?