AMcoder - javascript, python, java, html, php, sql

mypy. __eq__ անհամատեղելի է սուպերտիպի օբյեկտի հետ

սա իմ կոդը.

class Person:
    def __init__(self, id):
        self.id = id

    def __eq__(self, other: 'Person') -> bool:
        return self.id == other.id

   def compare(self, other: 'Person') -> bool:
        return self.id == other.id

mypy նետում error: Argument 1 of "__eq__" incompatible with supertype "object".

Բայց եթե ես հեռացնեմ __eq__ մեթոդը, mypy-ը չի բողոքի, թեև compare-ը նույնն է, ինչ __eq__-ը, ի՞նչ պետք է անեմ:

21.02.2019

  • Դուք տեսե՞լ եք սա 21.02.2019
  • Ես փորձեցի այն, և այն աշխատում է, պարզապես զարմանում եմ, արդյոք Any-ն այստեղ լավ պրակտիկա է: 21.02.2019

Պատասխանները:


1

Արմատային խնդիրն այն է, որ __eq__ մեթոդը պետք է ընդունի ցանկացած օբյեկտ. my_object == 3 անելը օրինական է գործարկման ժամանակ և միշտ պետք է վերադարձնի False: Դուք կարող եք դա տեսնել ինքներդ՝ ստուգելով object Tyshed-ում. __eq__-ի ստորագրությունը տրվում է որպես def __eq__(self, o: object) -> bool: ...

Այսպիսով, այս աշխատանքը կատարելու համար __eq__-ի իրականացման ճիշտ ձևը կլինի հետևյալը.

def __eq__(self, other: object) -> bool:
    if not isinstance(other, Person):
        # If we return NotImplemented, Python will automatically try
        # running other.__eq__(self), in case 'other' knows what to do with
        # Person objects.
        return NotImplemented
    return self.id == other.id

Եվ իրականում, եթե դուք թարմացնեք mypy-ի այն տարբերակը, որն օգտագործում եք, այն կտպագրի գրություն, որում խորհուրդ է տրվում ձեր ծածկագիրը ձևավորել այս կերպ:

Այնուամենայնիվ, այս մոտեցման խնդիրն այն է, որ mypy-ն այլևս չի բողոքի, եթե դուք ինչ-որ հիմար բան անեք, ինչպիսին Person() == 3ն է: Տեխնիկապես, դա պետք է վերադարձնի bool, բայց պրագմատիկորեն, ձեր կոդը, հավանաբար, ունի սխալ, եթե դուք համեմատում եք անձի օբյեկտը int-ի հետ:

Բարեբախտաբար, mypy-ը վերջերս ձեռք բերեց մի գործառույթ, որը կարող է նշել այս տեսակի սխալները՝ --strict-equality: Այժմ, երբ դուք գործարկում եք mypy-ն այդ դրոշակով, Person() == 3-ը կատարելով mypy-ի ելքային սխալներ կստեղծվեն, ինչպիսիք են Non-overlapping equality check (left operand type: "Person", right operand type: "int"), նույնիսկ եթե դուք սահմանեք __eq__-ը վերը նկարագրված ձևով:

Նկատի ունեցեք, որ դուք պետք է օգտագործեք mypy-ի վերջին տարբերակը master-ից՝ այս դրոշն օգտագործելու համար մինչև mypy-ի հաջորդ տարբերակը (0.680) թողարկվի: Դա պետք է տեղի ունենա գրելու պահից մոտավորապես 2-ից 3 շաբաթվա ընթացքում:


Եթե ​​__eq__-ը վերը նկարագրված ձևով սահմանելը այն չէ, ինչ դուք կարող եք անել ինչ-ինչ պատճառով, ես անձամբ խորհուրդ կտայի ճնշել տիպի սխալը՝ Անձը Any-ով փոխարինելու փոխարեն:

Այսպիսով, հիմնականում, արեք սա.

def __eq__(self, other: 'Person') -> bool:  # type: ignore
    return self.id == other.id

... միգուցե հակիրճ նշումի հետ մեկտեղ, թե ինչու եք ճնշում սխալը:

Այստեղ հիմնավորումն այն է, որ __eq__-ի այս սահմանումը, խիստ ասած, անապահով է (այն խախտում է ինչ-որ բան, որը հայտնի է որպես Լիսկովի փոխարինման սկզբունք) -- և եթե դուք պետք է անապահով որևէ բան անեք, հավանաբար ավելի լավ է հստակորեն նշել, որ դուք ավելի շուտ տապալում է տիպային համակարգը, այլ ոչ թե թաքցնում այն՝ օգտագործելով Any-ը:

Եվ գոնե այս կերպ, դուք դեռ կարող եք Person() == 3-ի նման արտահայտությունները դարձնել տիպային սխալ. Այդ պահին դուք կարող եք նաև օգտագործել object-ը և կառուցեք ձեր կոդը ճիշտ վարվելու համար:

21.02.2019
Նոր նյութեր

Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..