2015-05-20 9 views
9

Jestem nowicjuszem PyCharm, ale długoletnim użytkownikiem IntelliJ. W IntelliJ, podczas pisania definicji klasy, IDE może automatycznie wygenerować metodę konstruktora, equals() i hashCode() na podstawie zmiennych instancji. Jest to dobre nie tylko w celu oszczędzania pisania, ale także w celu zapobiegania nieumyślnym błędom i automatycznego wyrzucania najlepszych sprawdzonych metod.Czy PyCharm automatycznie generuje implementacje __eq __() i __hash __()?

Miałem nadzieję, że PyCharm może zrobić to samo, biorąc pod uwagę, że produkty pochodzą od tej samej firmy. Po wielu przeglądach i przeszukiwaniu dokumentacji, nie mogłem znaleźć niczego dla __eq__() lub __hash__(). Zgoda, zmienne instancji Pythona nie są jawnie określone, ale miałem nadzieję, że generator mógłby podążać za konwencją, na przykład oferując wszystkie parametry __init()__ jako potencjalne zmienne instancji. Jeśli chodzi o __init__(), I found something that will automatically add instance variable settings na __init__(), ale to podejście wydaje się bardziej uciążliwe niż zwykłe pisanie, a nawet nie dodaje zmiennych instancji jako parametrów do sygnatury __init__().

Czy brakuje mi czegoś w dokumentacji, czy może istnieje wtyczka, która może to zrobić?

Aktualizacja: aby było jasne, szukam czegoś, co generuje rzeczywistą implementację tych metod. Oznacza to, że jeśli miałem klasy o nazwie Point i pycharm wie moja klasa ma x i y zmienne instancji, wówczas automatycznie wygenerować to dla metody __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 

Odpowiednikiem jest łatwo zrobić w IntelliJ.

Odpowiedz

5

Można utworzyć Live Template

Under Plik-> Ustawienia- > Edytor-> Live T emplates Poszukaj Pythona Kliknij +, aby dodać, następnie nazwę moje "klasę" i upewnij się, że dodasz kontekst w gui dla plików Pythona.

Szablon Tekst:

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$ 

Zostawiłem „Opcje” -> „Rozwiń z” sekcji ustawionym na „Default (Tab)” Po tym punkcie, po wpisaniu „klasa” można użyć Wypełnij automatycznie kartę, aby wstawić szablon na żywo. Kursor zostanie odesłany do każdej sekcji zawartej jako zmienna w Tekstowym szablonie bieżącym.

Bardziej skomplikowane, tj. Typ listy, zmienne nie wydają się obsługiwane przez LiveTemplate. Na przykład warunkowe elementy w tekście szablonu na żywo lub ekspansje list nie są dostępne.

+0

I wcięte ciało klasy i dodał' def' do każdej instrukcji, i to działa poprawnie. Jednak nie generuje rzeczywistych ciał tych metod - chyba że używam ich niewłaściwie? –

+0

Dzięki, zaktualizowałem swoją odpowiedź, aby naprawić składnię, jak żenująco. W powyższym przykładzie umieściłem tylko w ciele tych metod słowo kluczowe "pass", można pisać w dowolnie wybranym przez siebie języku, a jednak to się uda, jednak sprawienie, by te ciała były uniwersalne, jest trudnym problemem, Myślę. Czy możesz podać przykład tego, co chcesz ogólnie zrobić __hash __(), na przykład? – OYRM

+1

Brak prob. Dla '__eq __()' szukam czegoś takiego jak przykład dodany do mojego OP. Dla '__hash __()', implementacja pokazana w [to pytanie] (http://stackoverflow.com/questions/4005318/how-to-implement-a-good-hash-function-in-python) wygląda dobrze - wywołanie 'hash()' na krotce tych samych rzeczy w porównaniu z '__eq __()'. Problem polega na tym, że nie uważam, że język szablonów PyCharm jest wystarczająco bogaty, aby iteracyjnie generować bloki kodu oparte na zmiennych wejściowych. Patrzyłem i patrzyłem, ale nadal mogłem się mylić. –

1

Wybierz class a następnie wykonaj jedną z:

  • Naciśnij Alt-Insert
  • Right Click -> Generate
  • Menu -> Code -> Generate
+1

Jedyną opcją w menu wynikowym jest 'Override Methods ...', która tworzy na przykład '__eq __()' ze standardową domyślną treścią 'return super() .__ eq__ (* args, ** kwargs) '.Zastanawiam się, czy istnieje sposób, aby rzeczywiście wygenerować implementację '__eq __()' i podobnych metod opartych na znanych zmiennych instancji. Czy jest jakiś sposób na zrobienie tego? (Czy mój PyCharm jest błędnie skonfigurowany i powinno być więcej opcji poza 'Override Methods ...'? Intellij ma inne opcje poza 'Override'.) –

Powiązane problemy