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.
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? –
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
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ć. –