Vairāk
Noteikt objekta veidu?
Vai ir vienkāršs veids, kā noteikt, vai mainīgais ir saraksts, vārdnīca vai kas cits? Es saņemu atpakaļ objektu, kas var būt jebkura tipa, un man ir jāspēj noteikt atšķirību.
1687
3
Lai iegūtu objekta tipu, varat izmantot iebūvēto funkciju
type()
. Nosūtot objektu kā vienīgo parametru, tiks atgriezts šī objekta tipa objekts:Tas, protams, darbojas arī ar pielāgotiem tipiem:
Ņemiet vērā, ka
type()
atgriezīs tikai objekta tiešo tipu, bet nevarēs jums pateikt par tipa pārmantojamību.Lai to aptvertu, jāizmanto funkcija
isinstance
. Tas, protams, darbojas arī iebūvētajiem tipiem:isinstance()
parasti ir vēlamais veids, kā nodrošināt objekta tipu, jo tā pieņem arī atvasinātos tipus. Tātad, ja vien jums patiešām nav nepieciešams tipa objekts (neatkarīgi no iemesla),isinstance()
izmantošana ir ieteicamāka nekātype()
.Arī otrais parametrs
isinstance()
pieņem tipu tupli, tāpēc ir iespējams pārbaudīt vairākus tipus vienlaicīgi. Tadisinstance
atgriezīs true, ja objekts pieder kādam no šiem tipiem:To var izdarīt, izmantojot
type()
:Pareizāk būtu izmantot
try
...except
bloku. Tādā veidā, ja jums ir klase, kas izskatās pēc saraksta vai dict, tā uzvedīsies pareizi neatkarīgi no tā, kāds ir tās tips reāli.Lai paskaidrotu, vēlamais veids, kā "noteikt atšķirību" starp mainīgo tipiem, ir kaut kas, ko sauc par duck typing: kamēr metodes (un atgriešanas tipi), uz kurām mainīgais reaģē, ir tādi, kādus sagaida jūsu apakšprogramma, rīkojieties ar to kā ar to, ko jūs sagaidāt, ka tas būs. Piemēram, ja jums ir klase, kas pārslogo iekavju operatorus ar
getattr
unsetattr
, bet izmanto kādu smieklīgu iekšējo shēmu, būtu pareizi, ja tā uzvestos kā vārdnīca, ja tā ir tā, ko tā mēģina atdarināt.Otra problēma ar
type(A) is type(B)
pārbaudi ir tā, ka, jaA
irB
apakšklase, tā tiek novērtēta kāfalse
, lai gan programmatiski varētu cerēt, ka tā būstrue
. Ja objekts ir saraksta apakšklase, tam būtu jādarbojas kā sarakstam: tipa pārbaude, kā tas parādīts otrā atbildē, to novērsīs. (tomērisinstance
darbosies).