¿Puede PyCharm generar automáticamente las implementaciones __eq __ () y __hash __ ()?

Soy un novato de PyCharm pero un usuario de IntelliJ desde hace mucho tiempo. En IntelliJ, cuando escribe una definición de clase, el IDE puede generar automáticamente un constructor, el método equals() método hashCode() según las variables de instancia. Esto es bueno no solo para guardar la escritura, sino también para evitar errores involuntarios y para lanzar automáticamente algunas prácticas recomendadas equals() y hashCode() .

Esperaba que PyCharm pudiera hacer lo mismo, dado que los productos son de la misma compañía. Después de buscar en Google y rastrear la documentación, no pude encontrar nada para __eq__() o __hash__() . Por supuesto, las variables de instancia de Python no se especifican explícitamente, pero esperaba que el generador pudiera seguir una convención como ofrecer todos los __init()__ como posibles variables de instancia. En cuanto a __init__() , encontré algo que agregará automáticamente la configuración de las variables de instancia en __init__() , pero este enfoque parece más engorroso que solo escribir, y ni siquiera agrega las variables de instancia como parámetros a la __init__() .

¿Me estoy perdiendo algo en la documentación, o quizás hay un complemento que puede hacer esto?

Actualización : para ser claros, estoy buscando algo que genere las implementaciones reales de estos métodos. Es decir, si tuviera una clase llamada Point , y PyCharm sabe que mi clase tiene variables de instancia x e y , entonces generaría esto automáticamente para el __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 

El equivalente se hace fácilmente en IntelliJ.

Puedes crear una plantilla en vivo

En Archivo-> Configuración-> Editor-> Plantillas en vivo Busque Python Haga clic en + para agregar, luego nombro a mi “clase” y me aseguro de agregar un contexto en la interfaz gráfica de usuario para los archivos de Python.

El texto de la plantilla:

 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$ 

Dejé mi “Opciones” -> “Expandir con” la sección establecida en “Predeterminado (Tabulación)” Después de este punto, cuando escriba “clase” puede usar la Tabulación completada automáticamente para insertar la plantilla activa. Su cursor se rebotará en cualquier sección incluida como variable en el Texto de plantilla en vivo.

Más complicadas, es decir, tipo de lista, las variables no parecen ser compatibles con LiveTemplate. Por ejemplo, los condicionales en el texto de la plantilla en vivo, o las expansiones de la lista, no parecen estar disponibles.

Seleccione la class y luego haga una de:

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