the lack of design patterns in python
TRANSCRIPT
![Page 1: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/1.jpg)
The (lack of) design patterns in Python
Joe GregorioGoogle
![Page 2: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/2.jpg)
Scope
My opinions.
![Page 3: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/3.jpg)
A Story
Mythology
![Page 4: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/4.jpg)
Blog
Python isn't Java without the compile
![Page 5: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/5.jpg)
Language
Not just about Python
![Page 6: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/6.jpg)
Language
Aren't Patterns Good?
![Page 7: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/7.jpg)
The Lack of Patterns in Python
1. Define 'lack of patterns'2. Show there really is a lack3. Explain why4. Draw useful conclusions
![Page 8: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/8.jpg)
Hard numbers
comp.lang.python
![Page 9: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/9.jpg)
comp.lang.python
“factory method pattern” - 0“abstract-factory pattern” - 0
“flyweight pattern” - 3“flyweight” - 36
“state pattern” - 10“strategy pattern” - 25“visitor pattern” - 60
![Page 10: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/10.jpg)
comp.lang.python
“dark matter” - 2“the pope” - 16“sausage” - 66
![Page 11: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/11.jpg)
Why
The patterns are built in.
![Page 12: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/12.jpg)
class Bisection (FindMinima): def algorithm(self,line): return (5.5,6.6)
class ConjugateGradient (FindMinima): def algorithm(self,line): return (3.3,4.4)
class MinimaSolver: # context class strategy='' def __init__ (self,strategy): self.strategy=strategy
def minima(self,line): return self.strategy.algorithm(line)
def changeAlgorithm(self,newAlgorithm): self.strategy = newAlgorithm
def test(): solver=MinimaSolver(ConjugateGradient()) print solver.minima((5.5,5.5)) solver.changeAlgorithm(Bisection()) print solver.minima((5.5,5.5))test()
![Page 13: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/13.jpg)
An Example
def bisection(line): return 5.5, 6.6
def conjugate_gradient(line): return 3.3, 4.4
def test(): solver = conjugate_gradient print solver((5.5,5.5)) solver = bisection print solver((5.5,5.5))
test()
![Page 14: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/14.jpg)
WikiPedia
This pattern is invisible in languages with first-class functions.
http://en.wikipedia.org/wiki/Strategy_pattern
![Page 15: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/15.jpg)
Catalog of Language Features
● First-class functions● Meta-programming● Iterators● Closures
![Page 16: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/16.jpg)
First Class Functions
>>> def f(a, b): ... return a + b... >>> g = f>>> f(1, 2)3>>> g(1, 2)3>>> a = [f, g]>>> a[0](4, 5)9
![Page 17: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/17.jpg)
Meta-Programmingclass A(object): def __init__(self): self.a = "Hello"
class B(object): def __init__(self): self.a = " World"
def make_a_B(): b = B() b.a = "!" return b
mycallables = [A, B, make_a_B]
>>> print [x().a for x in mycallables]
['Hello', ' World', '!']
![Page 18: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/18.jpg)
Iterators
for element in [1, 2, 3]: print elementfor element in (1, 2, 3): print elementfor key in {'one':1, 'two':2}: print keyfor char in "123": print charfor line in open("myfile.txt"): print line
![Page 19: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/19.jpg)
Iterators
class MyFib(object): def __init__(self): self.i = 2 def __iter__(self): return self def next(self): if self.i > 1000: raise StopIteration self.i = self.i * self.i return self.i
>>> print [x for x in MyFib()][4, 16, 256, 65536]
![Page 20: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/20.jpg)
Iterator Pattern
In object-oriented programming, the Iterator pattern is a design pattern in which iterators are used to access the elements of an aggregate
object sequentially without exposing its underlying representation.
http://en.wikipedia.org/wiki/Iterator_pattern
![Page 21: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/21.jpg)
Factory Method Pattern
The factory method pattern deals with the problem of creating objects without specifying
the exact class of the object to be created.
![Page 22: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/22.jpg)
Factory Method Patternclass A(object): def __init__(self): self.a = "Hello"
class B(object): def __init__(self): self.a = " World"
myfactory = { "greeting" : A, "subject" : B, }
>>> print myfactory["greeting"]().aHello
![Page 23: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/23.jpg)
Abstract Factory Pattern
This just a Factory Factory
![Page 24: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/24.jpg)
Strategy Pattern
def bisection(line): return 5.5, 6.6
def conjugate_gradient(line): return 3.3, 4.4
def test(): solver = conjugate_gradient print solver((5.5,5.5)) solver = bisection print solver((5.5,5.5))
test()
![Page 25: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/25.jpg)
Closures
Closures = First Class Functions + Env
![Page 26: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/26.jpg)
Closure Example
>>> def too_big(limit): def compare(x): return x > limit return compare
>>> f = too_big(100)
>>> f(100)False>>> f(101)True
![Page 27: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/27.jpg)
Closure Exampledef Dx(f, dx): def dfdx(x): return (f(x + dx) - f(x))/dx return dfdx
def f(x): return 3*x**2+x
>>> print f(1.0)4.0>>> print Dx(f, 0.01)(1.0)7.03>>> print Dx(Dx(f, 0.01), 0.01)(1.0)6.0
![Page 28: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/28.jpg)
Observer Pattern
The observer pattern (sometimes known as publish/subscribe) is a design pattern used in computer programming to observe the state of an object in a program.
http://en.wikipedia.org/wiki/Observer_pattern
![Page 29: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/29.jpg)
Observer Patternclass Point(object): def __init__(self, x, y): self.x = x self.y = y def scale(self, n): self.x = n * self.x self.y = n * self.y
def notify(f): def g(self, n): print n return f(self, n) return g
Point.scale = notify(Point.scale) p = Point(2.0, 3.0) p.scale(2.5)
![Page 30: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/30.jpg)
Decoratorsdef notify(f): def g(self, n): print n return f(self, n) return g
class Point(object): def __init__(self, x, y): self.x = x self.y = y
@notify def scale(self, n): self.x = n * self.x self.y = n * self.y
p = Point(2.0, 3.0) p.scale(2.5)
![Page 31: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/31.jpg)
So What?
So what?
![Page 32: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/32.jpg)
Other Patterns
Thoughts for the future
![Page 33: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/33.jpg)
Patterns
Concurrency PatternsActive ObjectBalkingGuardedThread PoolReactor
![Page 34: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/34.jpg)
Language Features
● Macros (Hygienic)● Channels● Multiple Dispatch
![Page 35: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/35.jpg)
1
The (lack of) design patterns in Python
Joe GregorioGoogle
![Page 36: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/36.jpg)
2
Scope
My opinions.
![Page 37: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/37.jpg)
3
A Story
Mythology
Let me tell you a story worked for new company (Java)this company had a mythologyall companies have mythologiesyou have to choose a subset of design tools, and then you have to continually justify those choices.(embedded - C++)Java was bestLanguage didn't matter (it was all Turing complete in the end)(the code in java byte code)All scripting languages were just Java w/o the compile
![Page 38: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/38.jpg)
4
Blog
Python isn't Java without the compile
So what do you do as a frustrated geek?you blog!be clear, I'm not first person to talk about this
Peter Norvig http://norvig.com/design-patterns/ppframe.htm
Bruce Tate – Beyond Java
![Page 39: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/39.jpg)
5
Language
Not just about Python
could be any languageand not just about bashing Java (we don't have the time for that)What features of Python obviate Patterns
![Page 40: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/40.jpg)
6
Language
Aren't Patterns Good?
Patterns are good because they give you a language to talk about program structure
OTOH, their use also points to a weakness in a language
![Page 41: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/41.jpg)
7
The Lack of Patterns in Python
1. Define 'lack of patterns'2. Show there really is a lack3. Explain why4. Draw useful conclusions
![Page 42: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/42.jpg)
8
Hard numbers
comp.lang.python
Now my talk hinges on their being an actual lack of design patterns in Python.
104,128 messages
![Page 43: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/43.jpg)
9
comp.lang.python
“factory method pattern” - 0“abstract-factory pattern” - 0
“flyweight pattern” - 3“flyweight” - 36
“state pattern” - 10“strategy pattern” - 25“visitor pattern” - 60
![Page 44: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/44.jpg)
10
comp.lang.python
“dark matter” - 2“the pope” - 16“sausage” - 66
![Page 45: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/45.jpg)
11
Why
The patterns are built in.
If your language of choice, in this case Python, supports an idiom natively, you don't need a name for it.
Nobody talks about the 'structured programming pattern', or the 'function pattern', or the 'object-oriented pattern'.
If you are old enough, you remember that there were actual arguments about this stuff, honest pushback from some programmers to 'structured programming'.
![Page 46: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/46.jpg)
12
class Bisection (FindMinima): def algorithm(self,line): return (5.5,6.6)
class ConjugateGradient (FindMinima): def algorithm(self,line): return (3.3,4.4)
class MinimaSolver: # context class strategy='' def __init__ (self,strategy): self.strategy=strategy
def minima(self,line): return self.strategy.algorithm(line)
def changeAlgorithm(self,newAlgorithm): self.strategy = newAlgorithm
def test(): solver=MinimaSolver(ConjugateGradient()) print solver.minima((5.5,5.5)) solver.changeAlgorithm(Bisection()) print solver.minima((5.5,5.5))test()
This example comes from comp.land.python and is an example of the “Strategy Pattern”strategy pattern (also known as the policy pattern) is a particular software design pattern, whereby algorithms can be selected at runtime.
![Page 47: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/47.jpg)
13
An Example
def bisection(line): return 5.5, 6.6
def conjugate_gradient(line): return 3.3, 4.4
def test(): solver = conjugate_gradient print solver((5.5,5.5)) solver = bisection print solver((5.5,5.5))
test()
Peter Otten:“When most of your code does nothing in a pompous way that is a sure signthat you are heading in the wrong direction. Here's a translation intopython”
![Page 48: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/48.jpg)
14
WikiPedia
This pattern is invisible in languages with first-class functions.
http://en.wikipedia.org/wiki/Strategy_pattern
First-class functions make this pattern go away!
What other language features are there? And what patterns do they make 'invisible'?
![Page 49: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/49.jpg)
15
Catalog of Language Features
● First-class functions● Meta-programming● Iterators● Closures
![Page 50: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/50.jpg)
16
First Class Functions
>>> def f(a, b): ... return a + b... >>> g = f>>> f(1, 2)3>>> g(1, 2)3>>> a = [f, g]>>> a[0](4, 5)9
A programming language is said to support first-class functions (or function literal) if it treats functions as first-class objects. Specifically, this means that the language supports constructing new functions during the execution of a program, storing them in data structures, passing them as arguments to other functions, and returning them as the values of other functions.First Class Object Definition: * being expressible as an anonymous literal value * being storable in variables * being storable in data structures * having an intrinsic identity (independent of any given name) * being comparable for equality with other entities * being passable as a parameter to a procedure/function * being returnable as the result of a procedure/function * being constructible at runtime * being printable * being readable * being transmissible among distributed processes * being storable outside running processesThe fetish seems to be to define it so that your language has them, but C does not.
![Page 51: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/51.jpg)
17
Meta-Programmingclass A(object): def __init__(self): self.a = "Hello"
class B(object): def __init__(self): self.a = " World"
def make_a_B(): b = B() b.a = "!" return b
mycallables = [A, B, make_a_B]
>>> print [x().a for x in mycallables]
['Hello', ' World', '!']
Classes are Fist Class Objects
They are 'callable', like methods
![Page 52: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/52.jpg)
18
Iterators
for element in [1, 2, 3]: print elementfor element in (1, 2, 3): print elementfor key in {'one':1, 'two':2}: print keyfor char in "123": print charfor line in open("myfile.txt"): print line
![Page 53: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/53.jpg)
19
Iterators
class MyFib(object): def __init__(self): self.i = 2 def __iter__(self): return self def next(self): if self.i > 1000: raise StopIteration self.i = self.i * self.i return self.i
>>> print [x for x in MyFib()][4, 16, 256, 65536]
Now let's look at some patterns
![Page 54: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/54.jpg)
20
Iterator Pattern
In object-oriented programming, the Iterator pattern is a design pattern in which iterators are used to access the elements of an aggregate
object sequentially without exposing its underlying representation.
http://en.wikipedia.org/wiki/Iterator_pattern
The definition of low-hanging fruit
![Page 55: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/55.jpg)
21
Factory Method Pattern
The factory method pattern deals with the problem of creating objects without specifying
the exact class of the object to be created.
The essence of the Factory Pattern is to "Define an interface for creating an object, but let the subclasses decide which class to instantiate. The Factory method lets a class defer instantiation to subclasses"
![Page 56: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/56.jpg)
22
Factory Method Patternclass A(object): def __init__(self): self.a = "Hello"
class B(object): def __init__(self): self.a = " World"
myfactory = { "greeting" : A, "subject" : B, }
>>> print myfactory["greeting"]().aHello
This is only a minor variation of using Classes as First Class Objects
Put the class objects in a map
![Page 57: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/57.jpg)
23
Abstract Factory Pattern
This just a Factory Factory
![Page 58: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/58.jpg)
24
Strategy Pattern
def bisection(line): return 5.5, 6.6
def conjugate_gradient(line): return 3.3, 4.4
def test(): solver = conjugate_gradient print solver((5.5,5.5)) solver = bisection print solver((5.5,5.5))
test()
First Class Functions
![Page 59: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/59.jpg)
25
Closures
Closures = First Class Functions + Env
Jumping back up to Language Features
Closures are First Class Functions that can keep variables that were in the environment when they were created
![Page 60: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/60.jpg)
26
Closure Example
>>> def too_big(limit): def compare(x): return x > limit return compare
>>> f = too_big(100)
>>> f(100)False>>> f(101)True
The variable 'limit' lives on beyond the scope of too_big().
![Page 61: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/61.jpg)
27
Closure Exampledef Dx(f, dx): def dfdx(x): return (f(x + dx) - f(x))/dx return dfdx
def f(x): return 3*x**2+x
>>> print f(1.0)4.0>>> print Dx(f, 0.01)(1.0)7.03>>> print Dx(Dx(f, 0.01), 0.01)(1.0)6.0
My favorite closure example of all time
![Page 62: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/62.jpg)
28
Observer Pattern
The observer pattern (sometimes known as publish/subscribe) is a design pattern used in computer programming to observe the state of an object in a program.
http://en.wikipedia.org/wiki/Observer_pattern
![Page 63: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/63.jpg)
29
Observer Patternclass Point(object): def __init__(self, x, y): self.x = x self.y = y def scale(self, n): self.x = n * self.x self.y = n * self.y
def notify(f): def g(self, n): print n return f(self, n) return g
Point.scale = notify(Point.scale) p = Point(2.0, 3.0) p.scale(2.5)
First Class Functions/Closure and First Class Classes
![Page 64: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/64.jpg)
30
Decoratorsdef notify(f): def g(self, n): print n return f(self, n) return g
class Point(object): def __init__(self, x, y): self.x = x self.y = y
@notify def scale(self, n): self.x = n * self.x self.y = n * self.y
p = Point(2.0, 3.0) p.scale(2.5)
First Class Functions/Closure and First Class Classes
![Page 65: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/65.jpg)
31
So What?
So what?
Now to draw useful conclusions
1. Python isn't Java w/o the compile Is a rich language with lots of features that obviate the need for many patterns
Need to ask yourself, does Python let me do this better with First Class Functions/First Class Classes/Closures/etc.2. Features reduce/remove patterns, and thus shorten code3. There are still patterns, and where those patterns exist, that's a ripe place for a new language feature4. This is a people problem
![Page 66: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/66.jpg)
32
Other Patterns
Thoughts for the future
The thing to note is that there are patterns that aren't covered by Python today (true for all languages).
What are those patterns? What are so higher level language features?
![Page 67: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/67.jpg)
33
Patterns
Concurrency PatternsActive ObjectBalkingGuardedThread PoolReactor
The Active Object design pattern decouples method execution from method invocation that reside in their own thread of control. The goal is to introduce concurrency, by using asynchronous method invocation and a scheduler for handling requests.
The Balking pattern is a software design pattern that only executes an action on an object when the object is in a particular state.
In concurrent programming, guarded suspension is a software design pattern for managing operations that require both a lock to be acquired and a precondition to be satisfied before the operation can be executed.
In the thread pool pattern in programming, a number of threads are created to perform a number of tasks, which are usually organized in a queue. Typically, there are many more tasks than threads.
The reactor design pattern is a concurrent programming pattern for handling service requests delivered concurrently to a service handler by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to the associated request handlers.
![Page 68: The lack of design patterns in python](https://reader033.vdocument.in/reader033/viewer/2022042614/554f0a14b4c90547648b53bf/html5/thumbnails/68.jpg)
34
Language Features
● Macros (Hygienic)● Channels● Multiple Dispatch
Macros (Lisp, obviously), D has both hygienic and non-hygienic macros
Channels, see Rob Pike video on channels in Newsqueak. Comes from C.A.R. Hoare's Concurrent Sequential Processes.
Guido gives an example of doing multimethods with decorators, other libraries
Multiple dispatch or multimethods is the feature of some object-oriented programming languages in which a function or method can be specialized on the type of more than one of its arguments.