a :jgB@sdZddlZddlmZddlmZmZddlm Z ddl m Z m Z m Z mZmZmZmZmZmZmZmZmZddZGd d d ejZeZGd d d eZGd ddeeZeZGdddZGdddeZGdddeZ GdddZ!GdddZ"ddZ#GdddZ$dS)zTests suite for MaskedArray & subclassing. :author: Pierre Gerard-Marchant :contact: pierregm_at_uga_dot_edu :version: $Id: test_subclassing.py 3473 2007-10-29 15:18:13Z jarrod.millman $ N)NDArrayOperatorsMixin)assert_ assert_raises) assert_equal) arrayarangemasked MaskedArray masked_arraylogaddhypotdivideasarray asanyarraynomaskcCst|dt||dSN)rlen)abrI/usr/local/lib/python3.9/site-packages/numpy/ma/tests/test_subclassing.pyassert_startswithsrcs@eZdZifddZfddZfddZfddZZS) SubArraycCst||}||_|Sr)nprviewcopyinfo)clsZarrrxrrr__new__s zSubArray.__new__cs"t|t|di|_dSNr)super__array_finalize__getattrrr)selfobj __class__rrr#s zSubArray.__array_finalize__cs(t|}|jddd|jd<|S)Naddedr)r"__add__rgetr%otherresultr'rrr+$s zSubArray.__add__cs(t|}|jddd|jd<|S)Niaddedrr*)r"__iadd__rr,r-r'rrr1)s zSubArray.__iadd__)__name__ __module__ __qualname__r r#r+r1 __classcell__rrr'rrs   rcs"eZdZdZdfdd ZZS)SubMaskedArrayzrrrrr::sr:c@s8eZdZdZddZddZddZdd Zd d Zd S) CSAIteratorz Flat iterator object that uses its own setter/getter (works around ndarray.flat not propagating subclass setters/getters see https://github.com/numpy/numpy/issues/4564) roughly following MaskedIterator cCs||_|tjj|_dSr) _originalrrndarrayflat _dataiter)r%rrrr__init__WszCSAIterator.__init__cCs|Srrr%rrr__iter__[szCSAIterator.__iter__cCs4|j|}t|tjs |}|t|j}|Sr) rD __getitem__ isinstancerrB __array__rtyperA)r%ZindxoutrrrrH^s   zCSAIterator.__getitem__cCs|j||j|<dSr)rA_validate_inputrD)r%indexvaluerrr __setitem__eszCSAIterator.__setitem__cCst|jt|jSr)nextrDrJrrKrArFrrr__next__hszCSAIterator.__next__N) r2r3r4r9rErGrHrPrRrrrrr@Ps r@csheZdZddZddZddZfddZfd d Zed d Z e j d d Z dfdd Z Z S)ComplicatedSubArraycCsd|tdS)Nz myprefix z mypostfix)rrrFrrr__str__nszComplicatedSubArray.__str__cCsd|jjd|dS)N< >)r(r2rFrrr__repr__qszComplicatedSubArray.__repr__cCst|tstd|S)Nz!Can only set to MySubArray values)rIrS ValueError)r%rOrrrrMus z#ComplicatedSubArray._validate_inputcst|||dSr)r"rPrMr%itemrOr'rrrPzszComplicatedSubArray.__setitem__cs*t|}t|tjs&|t}|Sr)r"rHrIrrBrJrrSrZr'rrrHs  zComplicatedSubArray.__getitem__cCst|Sr)r@rFrrrrCszComplicatedSubArray.flatcCs|}||dd<dSr)Zravel)r%rOyrrrrCsNFcsBt|||}|dur>|dtjur>|jddd|jd<|S)NrZ multipliedr*)r"__array_wrap__rmultiplyrr,)r%r&contextZ return_scalarr'rrr]sz"ComplicatedSubArray.__array_wrap__)NF) r2r3r4rTrXrMrPrHr?rCsetterr]r5rrr'rrSls    rSc@s:eZdZdZdZdZddZddZd d d Zd d Z dS) WrappedArrayz Wrapping a MaskedArray rather than subclassing to test that ufunc deferrals are commutative. See: https://github.com/numpy/numpy/issues/15200) _arrayattrscKs||_||_dSrrb)r%rrdrrrrEszWrappedArray.__init__cCs|jjd|jd|jdS)Nz(  z ))r(r2rcrdrFrrrrXszWrappedArray.__repr__NcCs t|jSr)rrrc)r%dtyperrrrrJszWrappedArray.__array__cs@|dkr8fdd|D}j||i|fijStSdS)N__call__cs"g|]}t|jr|jn|qSr)rIr(rc).0argrFrr sz0WrappedArray.__array_ufunc__..)r(rdNotImplemented)r%Zufuncmethodinputsr8rrFr__array_ufunc__s  zWrappedArray.__array_ufunc__)NN) r2r3r4r9 __slots__Z__array_priority__rErXrJrorrrrras rac@steZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZdS)TestSubclassingcCs,tjddd}t|gdd}||f|_dS)Nfloat)rg)rr*rrrr<)rr msubarrayr;r%rmxrrr setup_methodszTestSubclassing.setup_methodcCsTtd}gd}t|}t||d}tt|tt|j|tt|jtdS)Nrrrrr*rrrt) rrrr rrIr rr=)r%rmxsubZxmsubrrrtest_data_subclassings   z%TestSubclassing.test_data_subclassingcCs|j\}}tt|jtdSr)r;rrIr=subarrayrvrrrtest_maskedarray_subclassings z,TestSubclassing.test_maskedarray_subclassingcCs`|j\}}tjdd6ttt|ttt|t|Wdn1sR0YdSNignore)r)r;rerrstaterrIr rurrvrrrtest_masked_unary_operationss z,TestSubclassing.test_masked_unary_operationscCs|j\}}ttt||tttt||ttt||||ttt||jtttt||tttt ||tttt ||tdSr) r;rrIr rurr=r}outerr rvrrrtest_masked_binary_operationss z-TestSubclassing.test_masked_binary_operationscCs`|j\}}t|j|jd}ttt||tttt||ttt||t||dS)Nrt) r;r rJr<rrIrrur)r%rrwZxmxrrrtest_masked_binary_operations2s  z.TestSubclassing.test_masked_binary_operations2cCszttddgdgdd}tt|}t|}|d}tt|ttt|t tt|j t t |j j i|d}tt|ttt|ttt|j t t|j j ddk|d7}tt|ttt|ttt|j t t|j j ddk| gdt |jgd|j gd t |jgd t|d d id }t|}tt|d t |j |j dS)Nrrrr*rtr)r0)r*rrrr*)rrrrr*namer)rr)rrr r}rurrIr r:r=rrrZ _set_mask_maskr>hasattr)r%rZmyZymzr{mxsubrrrtest_attributepropagations4 z)TestSubclassing.test_attributepropagationcCs td}gd}ddt||D}t||d|id}t|dd}tt|t tt|tt|j |t |}tt|t tt|tt|j |t|d d}tt|tt|j |j t|j |j t |}tt|tt|j |j t|j |dS) NrrrycSsg|]\}}||fqSrr)riijrrrrk z=TestSubclassing.test_subclasspreservation..r{)r<rF)ZsubokT) rrzipr:r rrIr rrrrr)r%rrzZxinfor{rrrrtest_subclasspreservations(     z)TestSubclassing.test_subclasspreservationcCstd}t|}t|gdd}tt|dttt|dttt|ddttt|dttt|djtt|dtutt|djttt|ddjttt|jdjtt|jdtutt|jddj tt t |j d|dt t |j d|dt t |j t dd|dd|d|d<|dd|dd<t t |jj d|dt t |jj t dd|dd|d|jd<|dd|jdd<d S) z,test that getter and setter go via baseclassrrTFTFFrtr*r*.rrr.N)rrrSr rrIr;rrCbaserrYrPslice)r%rxcsubmxcsubrrrtest_subclass_items"s.   z#TestSubclassing.test_subclass_itemscCsjtd}t|}t|}tt|djttt|djttt|dttt|dtdS)Nrrrrr*r)rrrSr rrIr;)r%rrZ mxcsub_nomaskrrrtest_subclass_nomask_itemsGs z*TestSubclassing.test_subclass_nomask_itemscCs\td}t|gdd}tt|dt|}t|gdd}tt|dtjddS)zOtest that repr uses the name of the subclass and 'array' for np.ndarrayrrrrtr Zmasked_z(data=[--, 1, --, 3, 4]N)rrr rreprrr2)r%rrwr{rrrrtest_subclass_reprRs  z"TestSubclassing.test_subclass_reprcCsptd}t|}t|gdd}tt|dt|}tt|j dtj j j t|gdd}tt|ddS)z7test str with subclass that has overridden str, setitemrrrrtz [-- 1 -- 3 4]rz myprefix [-- 1 -- 3 4] mypostfixN) rrrr rstrrSrrYrPmacoreZmasked_print_option)r%rr{rrrrrrtest_subclass_str]s  z!TestSubclassing.test_subclass_strcCsvtdgdd}tgdd}t||}td|jvt|jddk||}td|jvt|jddkdS)Ntest)r*rrr)r;)rr*rrrrrr)r6rsubtractrr7)r%Zarr1Zarr2Zdiff1Zdiff2rrr$test_pure_subclass_info_preservationks z4TestSubclassing.test_pure_subclass_info_preservationN)r2r3r4rxr|r~rrrrrrrrrrrrrrrqs  !%  rqc@s eZdZdZddZddZdS)ArrayNoInheritancez6Quantity-like class that does not inherit from ndarraycCs||_||_dSr) magnitudeunits)r%r;rrrrrEzszArrayNoInheritance.__init__cCs t|j|Sr)r$r)r%attrrrr __getattr__~szArrayNoInheritance.__getattr__N)r2r3r4r9rErrrrrrxsrcCstjjgdgdd}t|d}tj|}t|j|jt|j|jgd|_t|j|jt|jtjj|dd}t|j|jt|j|jgd|_tgd|jt|j tjj|dd }t|j|jt|jgdt|j t|j dS) N)r*rr)TFTrtZmeters)TFFT)rF)Z keep_mask) rrrrrr;r<rZ sharedmask)Z data_maskedZdata_masked_unitsZ new_arrayrrrtest_array_no_inheritances&       rc@s,eZdZddZddZddZddZd S) TestClassWrappingcCs.tjjgdgdd}t|}||f|_dS)Nr*rrrFTFrt)rrr rar;r%rzwmrrrrxszTestClassWrapping.setup_methodcCsN|j\}}tjdd$ttt|tWdn1s@0YdSr)r;rrrrIr rarrrrrs z.TestClassWrapping.test_masked_unary_operationscCs4|j\}}ttt||tttt||tttt||ttt||||ttt||tttt||tttt||tttt||ttt|||t|||t ||g}ttt||tttt||ttt||t||dSr) r;rrIrr rarr rstack)r%rzrm2rrrrs "z/TestClassWrapping.test_masked_binary_operationscCsJt}tt|jddtjjgdgdd}t|}tt|jdddS)NZnot_a_real_attrr*rrrtZ not_an_attrr)rrAttributeError __setattr__rrr ra)r%Zmixinrzrrrrtest_mixins_have_slotss z(TestClassWrapping.test_mixins_have_slotsN)r2r3r4rxrrrrrrrrsr)%r9numpyrZnumpy.lib.mixinsrZ numpy.testingrrZnumpy.ma.testutilsrZ numpy.ma.corerrrr r r r r rrrrrrBrr}r6r:rur@rSrarqrrrrrrrs&  8+F