Slide 1

Slide 1 text

Magic Method, on the wall, who, now, is the _ _ f a i r e s t _ _ one of all? By Sep Dehpour Pycon 2017 zepworks.com sep at zepworks.com https://github.com/seperman

Slide 2

Slide 2 text

Disclaimer Magic methods are a very powerful feature of Python and can open a whole new door for you. However with great power comes great responsibility. The following experiments are solely for educational purposes and NOT for production code.

Slide 3

Slide 3 text

Experiment: Type Less > > > a = 1 0 > > > a = a + 2 0 > > > p r i n t ( a ) 3 0

Slide 4

Slide 4 text

Experiment: Type Less > > > a = 1 0 > > > a + = 2 0 > > > p r i n t ( a ) 3 0

Slide 5

Slide 5 text

Experiment: Type Less > > > a = 1 0 > > > a + 2 0 > > > p r i n t ( a ) 3 0

Slide 6

Slide 6 text

All Magic Methods

Slide 7

Slide 7 text

All Magic Methods

Slide 8

Slide 8 text

+ operator?

Slide 9

Slide 9 text

_ _ a d d _ _

Slide 10

Slide 10 text

Experiment 1: Type Less c l a s s N u m : d e f _ _ i n i t _ _ ( s e l f , v a l u e ) : s e l f . v a l u e = v a l u e

Slide 11

Slide 11 text

Experiment 1: Type Less c l a s s N u m : d e f _ _ i n i t _ _ ( s e l f , v a l u e ) : s e l f . v a l u e = v a l u e d e f _ _ a d d _ _ ( s e l f , o t h e r ) : s e l f . v a l u e + = o t h e r r e t u r n s e l f . v a l u e

Slide 12

Slide 12 text

Experiment 1: Type Less c l a s s N u m : d e f _ _ i n i t _ _ ( s e l f , v a l u e ) : s e l f . v a l u e = v a l u e d e f _ _ a d d _ _ ( s e l f , o t h e r ) : s e l f . v a l u e + = o t h e r r e t u r n s e l f . v a l u e d e f _ _ s u b _ _ ( s e l f , o t h e r ) : s e l f . v a l u e - = o t h e r r e t u r n s e l f . v a l u e

Slide 13

Slide 13 text

Experiment 1: Type Less c l a s s N u m : d e f _ _ i n i t _ _ ( s e l f , v a l u e ) : s e l f . v a l u e = v a l u e d e f _ _ a d d _ _ ( s e l f , o t h e r ) : s e l f . v a l u e + = o t h e r r e t u r n s e l f . v a l u e d e f _ _ s u b _ _ ( s e l f , o t h e r ) : s e l f . v a l u e - = o t h e r r e t u r n s e l f . v a l u e d e f _ _ r e p r _ _ ( s e l f ) : r e t u r n s t r ( s e l f . v a l u e ) _ _ s t r _ _ = _ _ r e p r _ _

Slide 14

Slide 14 text

Mutable Integer > > > a = N u m ( 1 0 ) > > > a 1 0

Slide 15

Slide 15 text

Mutable Integer > > > a = N u m ( 1 0 ) > > > a 1 0 > > > a + 2 0 > > > a 3 0

Slide 16

Slide 16 text

Mutable Integer > > > a = N u m ( 1 0 ) > > > a 1 0 > > > a + 2 0 > > > a 3 0 > > > a - 5 > > > a 2 5

Slide 17

Slide 17 text

Mutable Integer > > > a = N u m ( 1 0 ) > > > a 1 0 > > > a + 2 0 > > > a 3 0 > > > a - 5 > > > a 2 5 > > > 2 0 + a

Slide 18

Slide 18 text

Mutable Integer > > > a = N u m ( 1 0 ) > > > a 1 0 > > > a + 2 0 > > > a 3 0 > > > a - 5 > > > a 2 5 > > > 2 0 + a T y p e E r r o r : u n s u p p o r t e d o p e r a n d t y p e ( s ) f o r + : ' i n t ' a n d ' N u m '

Slide 19

Slide 19 text

Experiment: Type Less _ _ a d d _ _ d e f _ _ a d d _ _ ( s e l f , o t h e r ) : s e l f . v a l u e + = o t h e r r e t u r n s e l f . v a l u e

Slide 20

Slide 20 text

Experiment: Type Less _ _ a d d _ _ d e f _ _ a d d _ _ ( s e l f , o t h e r ) : s e l f . v a l u e + = o t h e r r e t u r n s e l f . v a l u e a + 2 0 - - - > a . _ _ a d d _ _ ( a , 2 0 )

Slide 21

Slide 21 text

Experiment: Type Less _ _ a d d _ _ d e f _ _ a d d _ _ ( s e l f , o t h e r ) : s e l f . v a l u e + = o t h e r r e t u r n s e l f . v a l u e a + 2 0 - - - > a . _ _ a d d _ _ ( a , 2 0 ) 2 0 + a - - - > i n t . _ _ a d d _ _ ( 2 0 , a )

Slide 22

Slide 22 text

Experiment: Type Less _ _ a d d _ _ d e f _ _ a d d _ _ ( s e l f , o t h e r ) : s e l f . v a l u e + = o t h e r r e t u r n s e l f . v a l u e a + 2 0 - - - > a . _ _ a d d _ _ ( a , 2 0 ) 2 0 + a - - - > i n t . _ _ a d d _ _ ( 2 0 , a ) T y p e E r r o r : u n s u p p o r t e d o p e r a n d t y p e ( s ) f o r + : ' i n t ' a n d ' N u m '

Slide 23

Slide 23 text

Reversed Magic methods They start with r

Slide 24

Slide 24 text

Reversed Magic methods They start with r _ _ r a d d _ _ and _ _ r s u b _ _

Slide 25

Slide 25 text

c l a s s N u m : d e f _ _ i n i t _ _ ( s e l f , v a l u e ) : s e l f . v a l u e = v a l u e d e f _ _ a d d _ _ ( s e l f , o t h e r ) : s e l f . v a l u e + = o t h e r r e t u r n s e l f . v a l u e d e f _ _ s u b _ _ ( s e l f , o t h e r ) : s e l f . v a l u e - = o t h e r r e t u r n s e l f . v a l u e d e f _ _ r e p r _ _ ( s e l f ) : r e t u r n s t r ( s e l f . v a l u e ) _ _ s t r _ _ = _ _ r e p r _ _

Slide 26

Slide 26 text

c l a s s N u m : d e f _ _ i n i t _ _ ( s e l f , v a l u e ) : s e l f . v a l u e = v a l u e d e f _ _ a d d _ _ ( s e l f , o t h e r ) : s e l f . v a l u e + = o t h e r r e t u r n s e l f . v a l u e d e f _ _ s u b _ _ ( s e l f , o t h e r ) : s e l f . v a l u e - = o t h e r r e t u r n s e l f . v a l u e d e f _ _ r e p r _ _ ( s e l f ) : r e t u r n s t r ( s e l f . v a l u e ) _ _ s t r _ _ = _ _ r e p r _ _ _ _ r a d d _ _ = _ _ a d d _ _

Slide 27

Slide 27 text

c l a s s N u m : d e f _ _ i n i t _ _ ( s e l f , v a l u e ) : s e l f . v a l u e = v a l u e d e f _ _ a d d _ _ ( s e l f , o t h e r ) : s e l f . v a l u e + = o t h e r r e t u r n s e l f . v a l u e d e f _ _ s u b _ _ ( s e l f , o t h e r ) : s e l f . v a l u e - = o t h e r r e t u r n s e l f . v a l u e d e f _ _ r e p r _ _ ( s e l f ) : r e t u r n s t r ( s e l f . v a l u e ) _ _ s t r _ _ = _ _ r e p r _ _ _ _ r a d d _ _ = _ _ a d d _ _ d e f _ _ r s u b _ _ ( s e l f , o t h e r ) : s e l f . v a l u e = o t h e r - s e l f . v a l u e r e t u r n s e l f . v a l u e

Slide 28

Slide 28 text

Experiment: Type Less > > > a = N u m ( 1 0 ) > > > a + 2 0 > > > a 3 0

Slide 29

Slide 29 text

Experiment: Type Less > > > a = N u m ( 1 0 ) > > > a + 2 0 > > > a 3 0 > > > a - 5 > > > a 2 5

Slide 30

Slide 30 text

Experiment: Type Less > > > a = N u m ( 1 0 ) > > > a + 2 0 > > > a 3 0 > > > a - 5 > > > a 2 5 > > > 4 0 + a > > > a 6 5

Slide 31

Slide 31 text

Experiment: Type Less > > > a = N u m ( 1 0 ) > > > a + 2 0 > > > a 3 0 > > > a - 5 > > > a 2 5 > > > 4 0 + a > > > a 6 5 > > > 2 0 - a > > > a - 4 5

Slide 32

Slide 32 text

Experiment 2: Print Filter

Slide 33

Slide 33 text

Experiment 2: Print Filter f o o = [ 1 , 2 , 3 , 5 , 6 , 7 ] b a r = f i l t e r ( l a m b d a x : x % 3 = = 0 , f o o )

Slide 34

Slide 34 text

Experiment 2: Print Filter f o o = [ 1 , 2 , 3 , 5 , 6 , 7 ] b a r = f i l t e r ( l a m b d a x : x % 3 = = 0 , f o o ) > > > p r i n t ( b a r )

Slide 35

Slide 35 text

Experiment 2: Print Filter f o o = [ 1 , 2 , 3 , 5 , 6 , 7 ] b a r = f i l t e r ( l a m b d a x : x % 3 = = 0 , f o o ) > > > p r i n t ( b a r ) < f i l t e r a t 0 x 1 1 9 1 5 1 d 1 8 >

Slide 36

Slide 36 text

Experiment 2: Print Filter f o o = [ 1 , 2 , 3 , 5 , 6 , 7 ] b a r = f i l t e r ( l a m b d a x : x % 3 = = 0 , f o o ) > > > p r i n t ( b a r ) [ 3 , 6 ]

Slide 37

Slide 37 text

Experiment 2: Print Filter f o o = [ 1 , 2 , 3 , 5 , 6 , 7 ] b a r = f i l t e r ( l a m b d a x : x % 3 = = 0 , f o o ) > > > p r i n t ( l i s t ( b a r ) ) [ 3 , 6 ]

Slide 38

Slide 38 text

Make filter print list again

Slide 39

Slide 39 text

Everything is an object

Slide 40

Slide 40 text

Everything is an object d e f f u n c ( x ) : p r e v i o u s _ x = g e t a t t r ( f u n c , " _ x " , " N o t s e t " )

Slide 41

Slide 41 text

Everything is an object d e f f u n c ( x ) : p r e v i o u s _ x = g e t a t t r ( f u n c , " _ x " , " N o t s e t " ) p r i n t ( " n e w v a l u e : { } , p r e v i o u s v a l u e : { } " . f o r m a t ( x , p r e v i o u s _ x ) )

Slide 42

Slide 42 text

Everything is an object d e f f u n c ( x ) : p r e v i o u s _ x = g e t a t t r ( f u n c , " _ x " , " N o t s e t " ) p r i n t ( " n e w v a l u e : { } , p r e v i o u s v a l u e : { } " . f o r m a t ( x , p r e v i o u s _ x ) ) f u n c . _ x = x

Slide 43

Slide 43 text

Everything is an object d e f f u n c ( x ) : p r e v i o u s _ x = g e t a t t r ( f u n c , " _ x " , " N o t s e t " ) p r i n t ( " n e w v a l u e : { } , p r e v i o u s v a l u e : { } " . f o r m a t ( x , p r e v i o u s _ x ) ) f u n c . _ x = x > > > f u n c ( 1 0 ) n e w v a l u e : 1 0 , p r e v i o u s v a l u e : N o t s e t

Slide 44

Slide 44 text

Everything is an object d e f f u n c ( x ) : p r e v i o u s _ x = g e t a t t r ( f u n c , " _ x " , " N o t s e t " ) p r i n t ( " n e w v a l u e : { } , p r e v i o u s v a l u e : { } " . f o r m a t ( x , p r e v i o u s _ x ) ) f u n c . _ x = x > > > f u n c ( 1 0 ) n e w v a l u e : 1 0 , p r e v i o u s v a l u e : N o t s e t > > > f u n c ( 2 0 ) n e w v a l u e : 2 0 , p r e v i o u s v a l u e : 1 0

Slide 45

Slide 45 text

Everything is an object d e f f u n c ( x ) : p r e v i o u s _ x = g e t a t t r ( f u n c , " _ x " , " N o t s e t " ) p r i n t ( " n e w v a l u e : { } , p r e v i o u s v a l u e : { } " . f o r m a t ( x , p r e v i o u s _ x ) ) f u n c . _ x = x > > > f u n c ( 1 0 ) n e w v a l u e : 1 0 , p r e v i o u s v a l u e : N o t s e t > > > f u n c ( 2 0 ) n e w v a l u e : 2 0 , p r e v i o u s v a l u e : 1 0 > > > f u n c ( 3 0 ) n e w v a l u e : 3 0 , p r e v i o u s v a l u e : 2 0

Slide 46

Slide 46 text

Everything is an object, even the built‑in functions

Slide 47

Slide 47 text

Experiment 2: Print Filter c l a s s F i l t e r ( f i l t e r ) :

Slide 48

Slide 48 text

Experiment 2: Print Filter c l a s s F i l t e r ( f i l t e r ) : d e f _ _ s t r _ _ ( s e l f ) : r e t u r n s t r ( l i s t ( s e l f ) ) _ _ r e p r _ _ = _ _ s t r _ _

Slide 49

Slide 49 text

Experiment 2: Print Filter c l a s s F i l t e r ( f i l t e r ) : d e f _ _ s t r _ _ ( s e l f ) : r e t u r n s t r ( l i s t ( s e l f ) ) _ _ r e p r _ _ = _ _ s t r _ _ b a r = F i l t e r ( l a m b d a x : x % 3 = = 0 , f o o )

Slide 50

Slide 50 text

Experiment 2: Print Filter c l a s s F i l t e r ( f i l t e r ) : d e f _ _ s t r _ _ ( s e l f ) : r e t u r n s t r ( l i s t ( s e l f ) ) _ _ r e p r _ _ = _ _ s t r _ _ b a r = F i l t e r ( l a m b d a x : x % 3 = = 0 , f o o ) > > > p r i n t ( b a r ) [ 3 , 6 ]

Slide 51

Slide 51 text

Experiment 3: Echo to file e c h o " h e l l o " > > f o o . t x t

Slide 52

Slide 52 text

Experiment 3: Echo to file Python 2 only p r i n t > > m y f i l e , " H e l l o W o r l d ! \ n " p r i n t > > m y f i l e , " I w a n t a b u r r i t o . "

Slide 53

Slide 53 text

> > operator?

Slide 54

Slide 54 text

operator method >> Binary operation of _ _ r s h i f t _ _

Slide 55

Slide 55 text

Experiment 3: Echo to file m y f i l e = o p e n ( " h e l l o . t x t " , " w " )

Slide 56

Slide 56 text

Experiment 3: Echo to file m y f i l e = o p e n ( " h e l l o . t x t " , " w " ) c l a s s E c h o : d e f _ _ i n i t _ _ ( s e l f , t e x t ) : s e l f . t e x t = t e x t

Slide 57

Slide 57 text

Experiment 3: Echo to file m y f i l e = o p e n ( " h e l l o . t x t " , " w " ) c l a s s E c h o : d e f _ _ i n i t _ _ ( s e l f , t e x t ) : s e l f . t e x t = t e x t d e f _ _ r s h i f t _ _ ( s e l f , o t h e r ) : o t h e r . s e e k ( 0 , 2 ) # s e e k e n d o f t h e f i l e o t h e r . w r i t e ( s e l f . t e x t )

Slide 58

Slide 58 text

Experiment 3: Echo to file m y f i l e = o p e n ( " h e l l o . t x t " , " w " ) c l a s s E c h o : d e f _ _ i n i t _ _ ( s e l f , t e x t ) : s e l f . t e x t = t e x t d e f _ _ r s h i f t _ _ ( s e l f , o t h e r ) : o t h e r . s e e k ( 0 , 2 ) o t h e r . w r i t e ( s e l f . t e x t ) # W r i t e s t o t h e e n d o f t h e f i l e ! E c h o ( " H e l l o W o r l d ! \ n " ) > > m y f i l e E c h o ( " W a n t a b u r r i t o ? " ) > > m y f i l e

Slide 59

Slide 59 text

Experiment 4: Pipe and Grep c o m m a n d | g r e p s o m e t h i n g

Slide 60

Slide 60 text

| operator?

Slide 61

Slide 61 text

Experiment 4: Pipe and Grep operator method | Binary operation of _ _ o r _ _

Slide 62

Slide 62 text

Experiment 4: Pipe and Grep c l a s s G r e p : d e f _ _ i n i t _ _ ( s e l f , i t e m ) : s e l f . i t e m = i t e m . l o w e r ( ) d e f _ _ o r _ _ ( s e l f , o t h e r ) : . . .

Slide 63

Slide 63 text

Experiment 4: Pipe and Grep c l a s s G r e p : d e f _ _ i n i t _ _ ( s e l f , i t e m ) : s e l f . i t e m = i t e m . l o w e r ( ) d e f _ _ o r _ _ ( s e l f , o t h e r ) : . . . g r e p ( s o m e t h i n g ) | t e x t

Slide 64

Slide 64 text

Experiment 4: Pipe and Grep c l a s s G r e p : d e f _ _ i n i t _ _ ( s e l f , i t e m ) : s e l f . i t e m = i t e m . l o w e r ( ) d e f _ _ o r _ _ ( s e l f , o t h e r ) : . . . g r e p ( s o m e t h i n g ) | t e x t t e x t | g r e p ( s o m e t h i n g )

Slide 65

Slide 65 text

_ _ r o r _ _

Slide 66

Slide 66 text

Experiment 4: Pipe and Grep c l a s s G r e p : d e f _ _ i n i t _ _ ( s e l f , i t e m ) : s e l f . i t e m = i t e m . l o w e r ( )

Slide 67

Slide 67 text

Experiment 4: Pipe and Grep c l a s s G r e p : d e f _ _ i n i t _ _ ( s e l f , i t e m ) : s e l f . i t e m = i t e m . l o w e r ( ) d e f i s _ i t e m _ i n _ l i n e ( s e l f , l i n e ) : r e t u r n s e l f . i t e m i n l i n e

Slide 68

Slide 68 text

Experiment 4: Pipe and Grep c l a s s G r e p : d e f _ _ i n i t _ _ ( s e l f , i t e m ) : s e l f . i t e m = i t e m . l o w e r ( ) d e f i s _ i t e m _ i n _ l i n e ( s e l f , l i n e ) : r e t u r n s e l f . i t e m i n l i n e d e f _ _ r o r _ _ ( s e l f , o t h e r ) : i f i s i n s t a n c e ( o t h e r , s t r ) : o t h e r = o t h e r . l o w e r ( ) . s p l i t ( ' \ n ' )

Slide 69

Slide 69 text

Experiment 4: Pipe and Grep c l a s s G r e p : d e f _ _ i n i t _ _ ( s e l f , i t e m ) : s e l f . i t e m = i t e m . l o w e r ( ) d e f i s _ i t e m _ i n _ l i n e ( s e l f , l i n e ) : r e t u r n s e l f . i t e m i n l i n e d e f _ _ r o r _ _ ( s e l f , o t h e r ) : i f i s i n s t a n c e ( o t h e r , s t r ) : o t h e r = o t h e r . l o w e r ( ) . s p l i t ( ' \ n ' ) r e t u r n F i l t e r ( s e l f . i s _ i t e m _ i n _ l i n e , o t h e r )

Slide 70

Slide 70 text

Experiment 4: Pipe and Grep > > > l i n e s = " " " W h e t h e r y o u ' r e n e w t o p r o g r a m m i n g o r a n e x p e r i e n c e d d e v e l o p e r , i t ' s e a s y t o l e a r n a n d u s e P y t h o n . C h e c k o u t j o b s . p y t h o n . o r g f o r P y t h o n j o b s . " " "

Slide 71

Slide 71 text

Experiment 4: Pipe and Grep > > > l i n e s = " " " W h e t h e r y o u ' r e n e w t o p r o g r a m m i n g o r a n e x p e r i e n c e d d e v e l o p e r , i t ' s e a s y t o l e a r n a n d u s e P y t h o n . C h e c k o u t j o b s . p y t h o n . o r g f o r P y t h o n j o b s . " " " > > > l i n e s | G r e p ( ' P y t h o n ' ) [ ' t o l e a r n a n d u s e P y t h o n . ' , ' c h e c k o u t j o b s . p y t h o n . o r g ' , ' f o r p y t h o n j o b s . ' ]

Slide 72

Slide 72 text

Experiment 4: Pipe and Grep > > > l i n e s = " " " W h e t h e r y o u ' r e n e w t o p r o g r a m m i n g o r a n e x p e r i e n c e d d e v e l o p e r , i t ' s e a s y t o l e a r n a n d u s e P y t h o n . C h e c k o u t j o b s . p y t h o n . o r g f o r P y t h o n j o b s . " " " > > > l i n e s | G r e p ( ' P y t h o n ' ) | G r e p ( ' j o b s ' ) [ ' c h e c k o u t j o b s . p y t h o n . o r g ' , ' f o r p y t h o n j o b s . ' ]

Slide 73

Slide 73 text

Experiment 5: The undeletable

Slide 74

Slide 74 text

Experiment 5: The undeletable > > > d e l n o r m a l _ o b j e c t

Slide 75

Slide 75 text

Experiment 5: The undeletable > > > d e l n o r m a l _ o b j e c t > > > n o r m a l _ o b j e c t

Slide 76

Slide 76 text

Experiment 5: The undeletable > > > d e l n o r m a l _ o b j e c t > > > n o r m a l _ o b j e c t T r a c e b a c k ( m o s t r e c e n t c a l l l a s t ) : F i l e " < s t d i n > " , l i n e 1 , i n < m o d u l e > N a m e E r r o r : n a m e ' n o r m a l _ o b j e c t ' i s n o t d e f i n e d

Slide 77

Slide 77 text

Experiment 5: The undeletable > > > d e l o b j

Slide 78

Slide 78 text

Experiment 5: The undeletable > > > d e l o b j < o b j : I ' m s t i l l h e r e . Y o u C A N N O T d e l e t e m e ! >

Slide 79

Slide 79 text

Experiment 5: The undeletable > > > d e l o b j < o b j : I ' m s t i l l h e r e . Y o u C A N N O T d e l e t e m e ! > > > > o b j < Y e s I ' m s t i l l h e r e ! >

Slide 80

Slide 80 text

What happens when you delete an object?

Slide 81

Slide 81 text

Garbage Collector (in CPython)

Slide 82

Slide 82 text

Reference counting i m p o r t g c c l a s s A : d e f _ _ s t r _ _ ( s e l f ) : r e t u r n " A o b j " _ _ r e p r _ _ = _ _ s t r _ _

Slide 83

Slide 83 text

Reference counting i m p o r t g c c l a s s A : d e f _ _ s t r _ _ ( s e l f ) : r e t u r n " A o b j " _ _ r e p r _ _ = _ _ s t r _ _ a = A ( ) p r i n t ( l e n ( g c . g e t _ r e f e r r e r s ( a ) ) ) # p r i n t s 1

Slide 84

Slide 84 text

Reference counting i m p o r t g c c l a s s A : d e f _ _ s t r _ _ ( s e l f ) : r e t u r n " A o b j " _ _ r e p r _ _ = _ _ s t r _ _ a = A ( ) p r i n t ( l e n ( g c . g e t _ r e f e r r e r s ( a ) ) ) # p r i n t s 1 d e f p r i n t _ r e f _ c o u n t ( o b j ) : p r i n t ( l e n ( g c . g e t _ r e f e r r e r s ( o b j ) ) )

Slide 85

Slide 85 text

Reference counting i m p o r t g c c l a s s A : d e f _ _ s t r _ _ ( s e l f ) : r e t u r n " A o b j " _ _ r e p r _ _ = _ _ s t r _ _ a = A ( ) p r i n t ( l e n ( g c . g e t _ r e f e r r e r s ( a ) ) ) # p r i n t s 1 d e f p r i n t _ r e f _ c o u n t ( o b j ) : p r i n t ( l e n ( g c . g e t _ r e f e r r e r s ( o b j ) ) ) p r i n t _ r e f _ c o u n t ( a )

Slide 86

Slide 86 text

Reference counting i m p o r t g c c l a s s A : d e f _ _ s t r _ _ ( s e l f ) : r e t u r n " A o b j " _ _ r e p r _ _ = _ _ s t r _ _ a = A ( ) p r i n t ( l e n ( g c . g e t _ r e f e r r e r s ( a ) ) ) # p r i n t s 1 d e f p r i n t _ r e f _ c o u n t ( o b j ) : p r i n t ( l e n ( g c . g e t _ r e f e r r e r s ( o b j ) ) ) p r i n t _ r e f _ c o u n t ( a ) # p r i n t s 2

Slide 87

Slide 87 text

Reference counting i m p o r t g c c l a s s A : d e f _ _ s t r _ _ ( s e l f ) : r e t u r n " A o b j " _ _ r e p r _ _ = _ _ s t r _ _ a = A ( ) p r i n t ( l e n ( g c . g e t _ r e f e r r e r s ( a ) ) ) # p r i n t s 1 d e f p r i n t _ r e f _ c o u n t ( o b j ) : p r i n t ( l e n ( g c . g e t _ r e f e r r e r s ( o b j ) ) ) p r i n t _ r e f _ c o u n t ( a ) # p r i n t s 2 p r i n t ( l e n ( g c . g e t _ r e f e r r e r s ( a ) ) ) # p r i n t s 1

Slide 88

Slide 88 text

Reference counting c = { 2 : a } d = { 1 : a } > > > p r i n t _ r e f _ c o u n t ( a ) 4

Slide 89

Slide 89 text

Reference counting c = { 2 : a } d = { 1 : a } > > > p r i n t _ r e f _ c o u n t ( a ) 4 > > > p r i n t ( a ) A o b j > > > p r i n t ( d [ 1 ] ) A o b j

Slide 90

Slide 90 text

Reference counting c = { 2 : a } d = { 1 : a } > > > p r i n t _ r e f _ c o u n t ( a ) 4 > > > p r i n t ( a ) A o b j > > > p r i n t ( d [ 1 ] ) A o b j > > > d e l a

Slide 91

Slide 91 text

Reference counting c = { 2 : a } d = { 1 : a } > > > p r i n t _ r e f _ c o u n t ( a ) 4 > > > p r i n t ( a ) A o b j > > > p r i n t ( d [ 1 ] ) A o b j > > > d e l a > > > p r i n t ( d [ 1 ] )

Slide 92

Slide 92 text

Reference counting c = { 2 : a } d = { 1 : a } > > > p r i n t _ r e f _ c o u n t ( a ) 4 > > > p r i n t ( a ) A o b j > > > p r i n t ( d [ 1 ] ) A o b j > > > d e l a > > > p r i n t ( d [ 1 ] ) A o b j

Slide 93

Slide 93 text

Reference counting c = { 2 : a } d = { 1 : a } > > > p r i n t _ r e f _ c o u n t ( a ) 4 > > > p r i n t ( a ) A o b j > > > p r i n t ( d [ 1 ] ) A o b j > > > d e l a > > > p r i n t ( d [ 1 ] ) A o b j > > > p r i n t _ r e f _ c o u n t ( d [ 1 ] )

Slide 94

Slide 94 text

Reference counting c = { 2 : a } d = { 1 : a } > > > p r i n t _ r e f _ c o u n t ( a ) 4 > > > p r i n t ( a ) A o b j > > > p r i n t ( d [ 1 ] ) A o b j > > > d e l a > > > p r i n t ( d [ 1 ] ) A o b j > > > p r i n t _ r e f _ c o u n t ( d [ 1 ] ) 3

Slide 95

Slide 95 text

_ _ d e l _ _

Slide 96

Slide 96 text

before c l a s s A : d e f _ _ s t r _ _ ( s e l f ) : r e t u r n " A o b j " _ _ r e p r _ _ = _ _ s t r _ _

Slide 97

Slide 97 text

after c l a s s A : d e f _ _ s t r _ _ ( s e l f ) : r e t u r n " A o b j " _ _ r e p r _ _ = _ _ s t r _ _ d e f _ _ d e l _ _ ( s e l f ) : p r i n t ( " D e l e t i n g a " )

Slide 98

Slide 98 text

c = { 2 : a } d = { 1 : a } > > > p r i n t _ r e f _ c o u n t ( a ) 4

Slide 99

Slide 99 text

c = { 2 : a } d = { 1 : a } > > > p r i n t _ r e f _ c o u n t ( a ) 4 > > > d e l a

Slide 100

Slide 100 text

c = { 2 : a } d = { 1 : a } > > > p r i n t _ r e f _ c o u n t ( a ) 4 > > > d e l a > > > p r i n t ( d [ 1 ] ) A o b j > > > p r i n t _ r e f _ c o u n t ( d [ 1 ] ) 3

Slide 101

Slide 101 text

c = { 2 : a } d = { 1 : a } > > > p r i n t _ r e f _ c o u n t ( a ) 4 > > > d e l a > > > p r i n t ( d [ 1 ] ) A o b j > > > p r i n t _ r e f _ c o u n t ( d [ 1 ] ) 3 > > > d e l c > > > p r i n t _ r e f _ c o u n t ( d [ 1 ] ) 2

Slide 102

Slide 102 text

c = { 2 : a } d = { 1 : a } > > > p r i n t _ r e f _ c o u n t ( a ) 4 > > > d e l a > > > p r i n t ( d [ 1 ] ) A o b j > > > p r i n t _ r e f _ c o u n t ( d [ 1 ] ) 3 > > > d e l c > > > p r i n t _ r e f _ c o u n t ( d [ 1 ] ) 2 > > > e x i t ( )

Slide 103

Slide 103 text

c = { 2 : a } d = { 1 : a } > > > p r i n t _ r e f _ c o u n t ( a ) 4 > > > d e l a > > > p r i n t ( d [ 1 ] ) A o b j > > > p r i n t _ r e f _ c o u n t ( d [ 1 ] ) 3 > > > d e l c > > > p r i n t _ r e f _ c o u n t ( d [ 1 ] ) 2 > > > e x i t ( ) D e l e t i n g a

Slide 104

Slide 104 text

c = { 2 : a } d = { 1 : a } > > > p r i n t _ r e f _ c o u n t ( a ) 4 > > > d e l a > > > p r i n t ( d [ 1 ] ) A o b j > > > p r i n t _ r e f _ c o u n t ( d [ 1 ] ) 3 > > > d e l c > > > p r i n t _ r e f _ c o u n t ( d [ 1 ] ) 2 > > > d e l d

Slide 105

Slide 105 text

c = { 2 : a } d = { 1 : a } > > > p r i n t _ r e f _ c o u n t ( a ) 4 > > > d e l a > > > p r i n t ( d [ 1 ] ) A o b j > > > p r i n t _ r e f _ c o u n t ( d [ 1 ] ) 3 > > > d e l c > > > p r i n t _ r e f _ c o u n t ( d [ 1 ] ) 2 > > > d e l d D e l e t i n g a > > > e x i t ( )

Slide 106

Slide 106 text

Experiment 5: The undeletable _ _ d e l _ _ > > > d e l o b j < o b j : I ' m s t i l l h e r e . Y o u C A N N O T d e l e t e m e ! > > > > o b j < Y e s I ' m s t i l l h e r e ! >

Slide 107

Slide 107 text

The undeletable: idea 1: stop _ _ d e l _ _ c l a s s O b j : d e f _ _ d e l _ _ ( s e l f ) : r a i s e E x c e p t i o n ( ' Y o u c a n n o t d e l e t e m e ' )

Slide 108

Slide 108 text

The undeletable: Idea 2: Resurrect c l a s s O b j : d e f _ _ d e l _ _ ( s e l f ) :

Slide 109

Slide 109 text

The undeletable: Idea 2: Resurrect c l a s s O b j : d e f _ _ d e l _ _ ( s e l f ) : g l o b a l o b j

Slide 110

Slide 110 text

The undeletable: Idea 2: Resurrect c l a s s O b j : d e f _ _ d e l _ _ ( s e l f ) : g l o b a l o b j o b j = s e l f p r i n t ( " Y o u c a n ' t d e l e t e m e ! " ) d e f _ _ s t r _ _ ( s e l f ) : r e t u r n " < o b j : { } > " . f o r m a t ( i d ( s e l f ) )

Slide 111

Slide 111 text

The undeletable: Idea 2: Resurrect c l a s s O b j : d e f _ _ d e l _ _ ( s e l f ) : g l o b a l o b j o b j = s e l f p r i n t ( " Y o u c a n ' t d e l e t e m e ! " ) d e f _ _ s t r _ _ ( s e l f ) : r e t u r n " < o b j : { } > " . f o r m a t ( i d ( s e l f ) ) > > > o b j = O b j ( ) > > > p r i n t ( o b j ) < o b j : 1 2 3 1 2 3 > > > > d e l o b j

Slide 112

Slide 112 text

The undeletable: Idea 2: Resurrect c l a s s O b j : d e f _ _ d e l _ _ ( s e l f ) : g l o b a l o b j o b j = s e l f p r i n t ( " Y o u c a n ' t d e l e t e m e ! " ) d e f _ _ s t r _ _ ( s e l f ) : r e t u r n " < o b j : { } > " . f o r m a t ( i d ( s e l f ) ) > > > o b j = O b j ( ) > > > p r i n t ( o b j ) < o b j : 1 2 3 1 2 3 > > > > d e l o b j Y o u c a n ' t d e l e t e m e !

Slide 113

Slide 113 text

The undeletable: Idea 2: Resurrect c l a s s O b j : d e f _ _ d e l _ _ ( s e l f ) : g l o b a l o b j o b j = s e l f p r i n t ( " Y o u c a n ' t d e l e t e m e ! " ) d e f _ _ s t r _ _ ( s e l f ) : r e t u r n " < o b j : { } > " . f o r m a t ( i d ( s e l f ) ) > > > o b j = O b j ( ) > > > p r i n t ( o b j ) < o b j : 1 2 3 1 2 3 > > > > d e l o b j Y o u c a n ' t d e l e t e m e ! > > > p r i n t ( o b j )

Slide 114

Slide 114 text

The undeletable: Idea 2: Resurrect c l a s s O b j : d e f _ _ d e l _ _ ( s e l f ) : g l o b a l o b j o b j = s e l f p r i n t ( " Y o u c a n ' t d e l e t e m e ! " ) d e f _ _ s t r _ _ ( s e l f ) : r e t u r n " < o b j : { } > " . f o r m a t ( i d ( s e l f ) ) > > > o b j = O b j ( ) > > > p r i n t ( o b j ) < o b j : 1 2 3 1 2 3 > > > > d e l o b j Y o u c a n ' t d e l e t e m e ! > > > p r i n t ( o b j ) < o b j : 1 2 3 1 2 3 >

Slide 115

Slide 115 text

p r i n t ( o b j ) d e l o b j p r i n t ( o b j )

Slide 116

Slide 116 text

Python 3.4+ PEP 442 < o b j : 4 4 8 2 7 8 6 1 9 2 > Y o u c a n ' t d e l e t e m e ! < o b j : 4 4 8 2 7 8 6 1 9 2 >

Slide 117

Slide 117 text

Python 2 to 3.3 < o b j : 4 5 4 9 4 3 5 7 6 0 > Y o u c a n ' t d e l e t e m e ! < o b j : 4 5 4 9 4 3 5 7 6 0 > Y o u c a n ' t d e l e t e m e ! Y o u c a n ' t d e l e t e m e !

Slide 118

Slide 118 text

What we learnt Making a number object so we type less Subclassed filter so we print the filtered and see the results Echo to file: E c h o ( " H e l l o W o r l d ! \ n " ) > > m y f i l e Pipe and grep l i n e s | G r e p ( ' P y t h o n ' ) | G r e p ( ' j o b s ' ) Undeletable object > > > d e l o b j Y o u c a n ' t d e l e t e m e !

Slide 119

Slide 119 text

bad‑ideas p i p i n s t a l l b a d - i d e a s It is a good idea to install bad ideas!

Slide 120

Slide 120 text

bad‑ideas But use them at your own risk. > > > f r o m b a d i m p o r t g r e p > > > L I N E S | g r e p ( ' P y t h o n ' ) | g r e p ( ' j o b s ' ) [ ' c h e c k o u t j o b s . p y t h o n . o r g ' , ' f o r p y t h o n j o b s . ' ] . . . > > > f r o m b a d i m p o r t U n d e l e t a b l e > > > o b j = U n d e l e t a b l e ( ) > > > d e l o b j Y o u c a n ' t d e l e t e m e ! . . .

Slide 121

Slide 121 text

Some further reads: http://doc.pypy.org/en/latest/cpython_differences.html https://morepypy.blogspot.com/2008/02/python‑finalizers‑semantics‑part‑2.html http://stackoverflow.com/questions/18971451/how‑many‑times‑can‑del‑be‑called‑per‑ object‑in‑python https://engineering.instagram.com/dismissing‑python‑garbage‑collection‑at‑instagram‑ 4dca40b29172

Slide 122

Slide 122 text

Magic Method, on the wall, who, now, is the _ _ f a i r e s t _ _ one of all? Article: http://zepworks.com/blog/magic‑method‑on‑the‑wall Code: https://github.com/seperman/bad‑ideas ‑‑ Sep Dehpour Pycon 2017 zepworks.com hello at zepworks.com https://github.com/seperman