2015-05-20 20 views
9

Ben bir PyCharm acemi ama uzun zamandır bir IntelliJ kullanıcısıyım. IntelliJ'te bir sınıf tanımı yazarken, IDE örnek değişkenlere dayalı olarak bir kurucu, equals() yöntemi ve hashCode() yöntemini otomatik olarak oluşturabilir. Bu sadece yazmayı kaydetmek için değil, yanlışlıkla hataları önlemek ve otomatik olarak bazı equals() ve hashCode() en iyi uygulamalara atmak için iyidir.Can PyCharm otomatik olarak __eq __() ve __hash __() uygulamalarını oluşturabilir mi?

PyCharm'ın aynı şirketten olduğu düşünüldüğünde PyCharm'ın aynı şeyi yapmasını umuyordum. Dokümanları inceledikten ve inceledikten sonra, __eq__() veya __hash__() için hiçbir şey bulamadım. Verilen, Python örnek değişkenleri açıkça belirtilmemiş, ancak jeneratörün olası örnek değişkenler olarak tüm __init()__ parametrelerini sunma gibi bir kuralı takip etmesini umuyordum. __init__(), I found something that will automatically add instance variable settings, __init__()'a gelince, ancak bu yaklaşım yalnızca yazarak yazmaktan daha elverişli görünmektedir ve örnek değişkenlerini __init__() imzasına parametre olarak eklemez.

Dokümantasyonda hiçbir şey eksik mi, yoksa belki de bunu yapabilecek bir eklenti var mı?

Güncelleştirme: açık olmak gerekirse, bu yöntemlerin gerçek uygulamalarını üreten bir şey arıyorum. Ben Point denilen bir sınıf olsaydı Yani, ve pycharm benim sınıf x ve y örnek değişkenler, o zaman otomatik olarak __eq__() yöntemi için bu üretecek olduğunu bilir:

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 

eşdeğer

kolayca IntelliJ yapılır. Sen Dosya-> Ayarlar- altında bir Live Template

oluşturabilir

  • Basın Alt-Insert
  • Right Click -> Generate
  • Menu -> Code -> Generate

cevap

5

:

+0

Her bir ifadeye sınıf gövdesini ekledim ve 'def 'ekledim ve başarılı bir şekilde çalıştı. Bununla birlikte, yanlış kullanılmadığı sürece, bu yöntemlerin gerçek bedenlerini oluşturmaz. –

+0

Teşekkürler, sözdizimini düzeltmek için cevabımı güncelledim, ne kadar utanç verici. Yukarıdaki örnekte, bu yöntemlerin gövdesine sadece 'pass' anahtar sözcüğünü yerleştirdim, hoşunuza giden herşeyi yazabilirsin, ve bunu yerine koyacağım, ancak bu bedenleri evrensel hale getirmek zor bir problem, Bence. Örneğin, genel amacın __hash __() olmasını istediğin bir örnek verebilir misin? – OYRM

+1

Sorun yok. __eq __() 'için, OP'ime eklediğim örnek gibi bir şey arıyorum. __hash __() 'için, [bu soruda] gösterilen uygulama (http://stackoverflow.com/questions/4005318/how-to-implement-a-good-hash-function-in-python) iyi görünüyor '__eq __()' ile karşılaştırıldığında, aynı şeylerin bir tuple üzerinde hash() '. Sorun, PyCharm canlı şablon dilinin, değişken girdilere dayanarak yinelemeli kod blokları oluşturacak kadar zengin olduğunu sanmıyorum. Baktım ve baktım ama hala yanılıyor olabilirim. –

1

class seçip birini yapın > Editör -> Canlı T 'u izler Python'a bakın Eklemek için + 'ı tıklatın, sonra benim "sınıf" olarak adlandırın ve Python dosyaları için gui'ye bir bağlam eklediğinizden emin olun.

Şablon Metin: ->, yazarken "class" kullanabilirsiniz Bu noktadan sonra "Varsayılan (Sekme)" olarak ayarlanmış bölümünde "ile Expand"
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$ 

benim "Seçenekler" sol Canlı şablonu eklemek için otomatik tamamlama sekmesi. İmleciniz, Canlı Şablon Metninde bir değişken olarak bulunan herhangi bir bölüme geri döner. Daha karmaşık, yani liste tipi, değişkenler LiveTemplate tarafından desteklenmiyor gibi görünmektedir. Örneğin, canlı şablon metnindeki şartlar veya liste genişletmeleri mevcut görünmüyor.

+1

Ortaya çıkan menüdeki seçeneklerden biri, 'default super() .__ eq__ (* args, **) standart bir varsayılan gövdesi ile bir __lq __()' üreten bir yöntemi geçersiz kılar. kwargs) '.Bilinen örnek değişkenlerine dayanarak '__eq __()' ve benzeri yöntemlerin gerçekte oluşturulmasının bir yolu olup olmadığını merak ediyorum. Bunu yapmanın bir yolu var mı? (Ya da PyCharm'ım yanlış yapılandırıldı ve 'Override Methods ...' ın yanı sıra daha fazla seçenek olmalı ... Intellij'ın 'Override' dışında başka seçenekleri de var.) –

İlgili konular