palestra sobre collections com python

48
Lightning Talk collections André Ericson Dezembro/2011, Pug-Pe

Upload: pugpe

Post on 25-Jun-2015

1.985 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Palestra sobre Collections com Python

Lightning Talkcollections

André EricsonDezembro/2011, Pug-Pe

Page 2: Palestra sobre Collections com Python

collectionsRoteiro

• Counter• deque• namedtuple• OrderedDict• abc• collections.abc

Page 3: Palestra sobre Collections com Python

collections.Counter

Page 4: Palestra sobre Collections com Python

Counter

1 >>> c = Counter([’a’, ’b’, ’c’, ’d’, ’a’, ’d’, ’b’])2 >>> print c3 Counter({’a’: 2, ’b’: 2, ’d’: 2, ’c’: 1})

4 # Funciona como um dicionario5 >>> print c[’a’]6 27 >>> c[’a’] += 18 >>> print c9 Counter({’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})

10 >>> print c[’e’] # Retorna 0 ao inves de levantar KeyError11 0

12 >>> c.most_common(3)13 [(’a’, 3), (’b’, 2), (’d’, 2)]14 >>> c[’f’] = ’asdad’ # Pode adicionar qualquer coisa15 >>> print c16 Counter({’f’: ’asdad’, ’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})17 >>> c[’f’] > c[’a’]18 True

19 >>> c.update([’a’, ’b’, ’b’, ’d’])20 # c.subtract(iterable-or-mapping) faz o subtracao de elementos21 >>> print c22 Counter({’f’: ’asdad’, ’a’: 4, ’b’: 4, ’d’: 3, ’c’: 1})

Page 5: Palestra sobre Collections com Python

Counter

1 >>> c = Counter([’a’, ’b’, ’c’, ’d’, ’a’, ’d’, ’b’])2 >>> print c3 Counter({’a’: 2, ’b’: 2, ’d’: 2, ’c’: 1})

4 # Funciona como um dicionario5 >>> print c[’a’]6 27 >>> c[’a’] += 18 >>> print c9 Counter({’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})

10 >>> print c[’e’] # Retorna 0 ao inves de levantar KeyError11 0

12 >>> c.most_common(3)13 [(’a’, 3), (’b’, 2), (’d’, 2)]14 >>> c[’f’] = ’asdad’ # Pode adicionar qualquer coisa15 >>> print c16 Counter({’f’: ’asdad’, ’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})17 >>> c[’f’] > c[’a’]18 True

19 >>> c.update([’a’, ’b’, ’b’, ’d’])20 # c.subtract(iterable-or-mapping) faz o subtracao de elementos21 >>> print c22 Counter({’f’: ’asdad’, ’a’: 4, ’b’: 4, ’d’: 3, ’c’: 1})

Page 6: Palestra sobre Collections com Python

Counter

1 >>> c = Counter([’a’, ’b’, ’c’, ’d’, ’a’, ’d’, ’b’])2 >>> print c3 Counter({’a’: 2, ’b’: 2, ’d’: 2, ’c’: 1})

4 # Funciona como um dicionario5 >>> print c[’a’]6 27 >>> c[’a’] += 18 >>> print c9 Counter({’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})

10 >>> print c[’e’] # Retorna 0 ao inves de levantar KeyError11 0

12 >>> c.most_common(3)13 [(’a’, 3), (’b’, 2), (’d’, 2)]14 >>> c[’f’] = ’asdad’ # Pode adicionar qualquer coisa15 >>> print c16 Counter({’f’: ’asdad’, ’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})17 >>> c[’f’] > c[’a’]18 True

19 >>> c.update([’a’, ’b’, ’b’, ’d’])20 # c.subtract(iterable-or-mapping) faz o subtracao de elementos21 >>> print c22 Counter({’f’: ’asdad’, ’a’: 4, ’b’: 4, ’d’: 3, ’c’: 1})

Page 7: Palestra sobre Collections com Python

Counter

1 >>> c = Counter([’a’, ’b’, ’c’, ’d’, ’a’, ’d’, ’b’])2 >>> print c3 Counter({’a’: 2, ’b’: 2, ’d’: 2, ’c’: 1})

4 # Funciona como um dicionario5 >>> print c[’a’]6 27 >>> c[’a’] += 18 >>> print c9 Counter({’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})

10 >>> print c[’e’] # Retorna 0 ao inves de levantar KeyError11 0

12 >>> c.most_common(3)13 [(’a’, 3), (’b’, 2), (’d’, 2)]14 >>> c[’f’] = ’asdad’ # Pode adicionar qualquer coisa15 >>> print c16 Counter({’f’: ’asdad’, ’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})17 >>> c[’f’] > c[’a’]18 True

19 >>> c.update([’a’, ’b’, ’b’, ’d’])20 # c.subtract(iterable-or-mapping) faz o subtracao de elementos21 >>> print c22 Counter({’f’: ’asdad’, ’a’: 4, ’b’: 4, ’d’: 3, ’c’: 1})

Page 8: Palestra sobre Collections com Python

Counter

1 >>> c = Counter([’a’, ’b’, ’c’, ’d’, ’a’, ’d’, ’b’])2 >>> print c3 Counter({’a’: 2, ’b’: 2, ’d’: 2, ’c’: 1})

4 # Funciona como um dicionario5 >>> print c[’a’]6 27 >>> c[’a’] += 18 >>> print c9 Counter({’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})

10 >>> print c[’e’] # Retorna 0 ao inves de levantar KeyError11 0

12 >>> c.most_common(3)13 [(’a’, 3), (’b’, 2), (’d’, 2)]14 >>> c[’f’] = ’asdad’ # Pode adicionar qualquer coisa15 >>> print c16 Counter({’f’: ’asdad’, ’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})17 >>> c[’f’] > c[’a’]18 True

19 >>> c.update([’a’, ’b’, ’b’, ’d’])20 # c.subtract(iterable-or-mapping) faz o subtracao de elementos21 >>> print c22 Counter({’f’: ’asdad’, ’a’: 4, ’b’: 4, ’d’: 3, ’c’: 1})

Page 9: Palestra sobre Collections com Python

Counter: Exemplo

1 import re2 from collections import Counter3 LANGUAGES = [4 "C", "C++", "Java", "PHP", "Ruby", "C#",5 "JavaScript", "Perl", "Python"6 ]78 swear_book = [9 ’shit’, ’piss’, ’fuck’,10 ’cock’, ’motherfucker’,11 ]1213 lang_count = Counter()14 swear_count = Counter()1516 for lang in LANGUAGES:17 with open(’language-commits[’ + lang +18 ’].yml’) as f:19 words = re.findall(’\w+’, f.read().lower())20 for fu in words:21 if fu in swear_book:22 lang_count[lang] += 123 swear_count[fu] += 12425 print lang_count26 print swear_count

Counter({’C++’: 67, ’Ruby’: 64,’JavaScript’: 55, ’C’: 39,’Perl’: 33, ’C#’: 29,’Java’: 23, ’Python’: 15,’PHP’: 11})

Counter({’shit’: 213, ’fuck’: 112,’piss’: 5, ’cock’: 4,’motherfucker’: 2})

data from: https://github.com/AndrewVos/github-statistics

Page 10: Palestra sobre Collections com Python

collections.deque

Page 11: Palestra sobre Collections com Python

deque

img: http://www.webreference.com

Page 12: Palestra sobre Collections com Python

deque

• lists são lentas para pop(0) e insert(0, v) --> O(n)• deque pop e insert no fim ou no início com O(1)• deque não substitui list

Page 13: Palestra sobre Collections com Python

deque

1 >>> d = deque([1,2,3])2 >>> print d3 deque([1, 2, 3])

4 >>> d.append(4)5 >>> print d6 deque([1, 2, 3, 4])

7 >>> d.appendleft(5)8 >>> print d9 deque([5, 1, 2, 3, 4])

10 >>> d.pop(), d.popleft()11 (4, 5)12 >>> del d[1]13 >>> print d14 deque([1, 3])

15 >>> d.extend([7, 8, 9])16 >>> print d17 deque([1, 3, 7, 8, 9])

18 >>> d.rotate(1) # Rotaciona a direita19 >>> print d20 deque([9, 1, 3, 7, 8])

21 >>> d = deque([1,2,3], maxlen=3)22 >>> print d23 deque([1, 2, 3], maxlen=3)24 >>> d.append(4)25 deque([2, 3, 4], maxlen=3)

Page 14: Palestra sobre Collections com Python

deque

1 >>> d = deque([1,2,3])2 >>> print d3 deque([1, 2, 3])

4 >>> d.append(4)5 >>> print d6 deque([1, 2, 3, 4])

7 >>> d.appendleft(5)8 >>> print d9 deque([5, 1, 2, 3, 4])

10 >>> d.pop(), d.popleft()11 (4, 5)12 >>> del d[1]13 >>> print d14 deque([1, 3])

15 >>> d.extend([7, 8, 9])16 >>> print d17 deque([1, 3, 7, 8, 9])

18 >>> d.rotate(1) # Rotaciona a direita19 >>> print d20 deque([9, 1, 3, 7, 8])

21 >>> d = deque([1,2,3], maxlen=3)22 >>> print d23 deque([1, 2, 3], maxlen=3)24 >>> d.append(4)25 deque([2, 3, 4], maxlen=3)

Page 15: Palestra sobre Collections com Python

deque

1 >>> d = deque([1,2,3])2 >>> print d3 deque([1, 2, 3])

4 >>> d.append(4)5 >>> print d6 deque([1, 2, 3, 4])

7 >>> d.appendleft(5)8 >>> print d9 deque([5, 1, 2, 3, 4])

10 >>> d.pop(), d.popleft()11 (4, 5)12 >>> del d[1]13 >>> print d14 deque([1, 3])

15 >>> d.extend([7, 8, 9])16 >>> print d17 deque([1, 3, 7, 8, 9])

18 >>> d.rotate(1) # Rotaciona a direita19 >>> print d20 deque([9, 1, 3, 7, 8])

21 >>> d = deque([1,2,3], maxlen=3)22 >>> print d23 deque([1, 2, 3], maxlen=3)24 >>> d.append(4)25 deque([2, 3, 4], maxlen=3)

Page 16: Palestra sobre Collections com Python

deque

1 >>> d = deque([1,2,3])2 >>> print d3 deque([1, 2, 3])

4 >>> d.append(4)5 >>> print d6 deque([1, 2, 3, 4])

7 >>> d.appendleft(5)8 >>> print d9 deque([5, 1, 2, 3, 4])

10 >>> d.pop(), d.popleft()11 (4, 5)12 >>> del d[1]13 >>> print d14 deque([1, 3])

15 >>> d.extend([7, 8, 9])16 >>> print d17 deque([1, 3, 7, 8, 9])

18 >>> d.rotate(1) # Rotaciona a direita19 >>> print d20 deque([9, 1, 3, 7, 8])

21 >>> d = deque([1,2,3], maxlen=3)22 >>> print d23 deque([1, 2, 3], maxlen=3)24 >>> d.append(4)25 deque([2, 3, 4], maxlen=3)

Page 17: Palestra sobre Collections com Python

deque

1 >>> d = deque([1,2,3])2 >>> print d3 deque([1, 2, 3])

4 >>> d.append(4)5 >>> print d6 deque([1, 2, 3, 4])

7 >>> d.appendleft(5)8 >>> print d9 deque([5, 1, 2, 3, 4])

10 >>> d.pop(), d.popleft()11 (4, 5)12 >>> del d[1]13 >>> print d14 deque([1, 3])

15 >>> d.extend([7, 8, 9])16 >>> print d17 deque([1, 3, 7, 8, 9])

18 >>> d.rotate(1) # Rotaciona a direita19 >>> print d20 deque([9, 1, 3, 7, 8])

21 >>> d = deque([1,2,3], maxlen=3)22 >>> print d23 deque([1, 2, 3], maxlen=3)24 >>> d.append(4)25 deque([2, 3, 4], maxlen=3)

Page 18: Palestra sobre Collections com Python

deque

1 >>> d = deque([1,2,3])2 >>> print d3 deque([1, 2, 3])

4 >>> d.append(4)5 >>> print d6 deque([1, 2, 3, 4])

7 >>> d.appendleft(5)8 >>> print d9 deque([5, 1, 2, 3, 4])

10 >>> d.pop(), d.popleft()11 (4, 5)12 >>> del d[1]13 >>> print d14 deque([1, 3])

15 >>> d.extend([7, 8, 9])16 >>> print d17 deque([1, 3, 7, 8, 9])

18 >>> d.rotate(1) # Rotaciona a direita19 >>> print d20 deque([9, 1, 3, 7, 8])

21 >>> d = deque([1,2,3], maxlen=3)22 >>> print d23 deque([1, 2, 3], maxlen=3)24 >>> d.append(4)25 deque([2, 3, 4], maxlen=3)

Page 19: Palestra sobre Collections com Python

deque

1 >>> d = deque([1,2,3])2 >>> print d3 deque([1, 2, 3])

4 >>> d.append(4)5 >>> print d6 deque([1, 2, 3, 4])

7 >>> d.appendleft(5)8 >>> print d9 deque([5, 1, 2, 3, 4])

10 >>> d.pop(), d.popleft()11 (4, 5)12 >>> del d[1]13 >>> print d14 deque([1, 3])

15 >>> d.extend([7, 8, 9])16 >>> print d17 deque([1, 3, 7, 8, 9])

18 >>> d.rotate(1) # Rotaciona a direita19 >>> print d20 deque([9, 1, 3, 7, 8])

21 >>> d = deque([1,2,3], maxlen=3)22 >>> print d23 deque([1, 2, 3], maxlen=3)24 >>> d.append(4)25 deque([2, 3, 4], maxlen=3)

Page 20: Palestra sobre Collections com Python

deque vs list

1 num = 1000002 print u"Tempo para insercao no inicio:"3 print "Deque:",4 print timeit.Timer(’dq.appendleft("abc")’,5 ’from collections import deque;’+6 ’dq = deque()’).timeit(number=num)7 print "List:",8 print timeit.Timer(’li.insert(0, "abc")’,9 ’li =[]’).timeit(number=num)10 print "Tempo para pop(0):"11 print "Deque:",12 print timeit.Timer(’dq.popleft()’,13 ’from collections import deque;’+14 ’dq = deque(range(%i))’ % num15 ).timeit(number=num)16 print "List:",17 print timeit.Timer(’li.pop(0)’,18 ’li = range(%i)’ % num19 ).timeit(number=num)20 print "Tempo de acesso ao meio:"21 print "Deque:",22 print timeit.Timer(’dq[meio]’, ’from collections import deque;’+23 ’dq = deque(range(%i));’ % num +24 ’meio = len(dq)/2’).timeit()25 print "List:",26 print timeit.Timer(’li[meio]’, ’li = range(%i);’ % num +27 ’meio = len(li)/2’).timeit()

Tempo para insercao no inicio:Deque: 0.0206291675568List: 5.03016710281----------Tempo para pop(0):Deque: 0.0202388763428List: 3.49450302124----------Tempo de acesso ao meio:Deque: 4.97369003296List: 0.051794052124

Page 21: Palestra sobre Collections com Python

collections.namedtuple

Page 22: Palestra sobre Collections com Python

namedtuple

1 >>> Point = namedtuple(’Point’, [’x’, ’y’])2 >>> p = Point(2, 3)3 >>> print p.x, p.y4 2 3

5 >>> print p[0:2]6 (2, 3)7 >>> print p.count(2) # herda metodos de tuple8 1

9 >>> Point._make([1,2])10 Point(x=1, y=2)

11 >>> p._asdict()12 OrderedDict([(’x’, 2), (’y’, 3)])

13 >>> p._replace(x=77)14 Point(x=77, y=3)

15 >>> p._fields16 (’x’, ’y’)

Page 23: Palestra sobre Collections com Python

namedtuple

1 >>> Point = namedtuple(’Point’, [’x’, ’y’])2 >>> p = Point(2, 3)3 >>> print p.x, p.y4 2 3

5 >>> print p[0:2]6 (2, 3)7 >>> print p.count(2) # herda metodos de tuple8 1

9 >>> Point._make([1,2])10 Point(x=1, y=2)

11 >>> p._asdict()12 OrderedDict([(’x’, 2), (’y’, 3)])

13 >>> p._replace(x=77)14 Point(x=77, y=3)

15 >>> p._fields16 (’x’, ’y’)

Page 24: Palestra sobre Collections com Python

namedtuple

1 >>> Point = namedtuple(’Point’, [’x’, ’y’])2 >>> p = Point(2, 3)3 >>> print p.x, p.y4 2 3

5 >>> print p[0:2]6 (2, 3)7 >>> print p.count(2) # herda metodos de tuple8 1

9 >>> Point._make([1,2])10 Point(x=1, y=2)

11 >>> p._asdict()12 OrderedDict([(’x’, 2), (’y’, 3)])

13 >>> p._replace(x=77)14 Point(x=77, y=3)

15 >>> p._fields16 (’x’, ’y’)

Page 25: Palestra sobre Collections com Python

namedtuple

1 >>> Point = namedtuple(’Point’, [’x’, ’y’])2 >>> p = Point(2, 3)3 >>> print p.x, p.y4 2 3

5 >>> print p[0:2]6 (2, 3)7 >>> print p.count(2) # herda metodos de tuple8 1

9 >>> Point._make([1,2])10 Point(x=1, y=2)

11 >>> p._asdict()12 OrderedDict([(’x’, 2), (’y’, 3)])

13 >>> p._replace(x=77)14 Point(x=77, y=3)

15 >>> p._fields16 (’x’, ’y’)

Page 26: Palestra sobre Collections com Python

namedtuple

1 >>> Point = namedtuple(’Point’, [’x’, ’y’])2 >>> p = Point(2, 3)3 >>> print p.x, p.y4 2 3

5 >>> print p[0:2]6 (2, 3)7 >>> print p.count(2) # herda metodos de tuple8 1

9 >>> Point._make([1,2])10 Point(x=1, y=2)

11 >>> p._asdict()12 OrderedDict([(’x’, 2), (’y’, 3)])

13 >>> p._replace(x=77)14 Point(x=77, y=3)

15 >>> p._fields16 (’x’, ’y’)

Page 27: Palestra sobre Collections com Python

namedtuple

1 >>> Point = namedtuple(’Point’, [’x’, ’y’])2 >>> p = Point(2, 3)3 >>> print p.x, p.y4 2 3

5 >>> print p[0:2]6 (2, 3)7 >>> print p.count(2) # herda metodos de tuple8 1

9 >>> Point._make([1,2])10 Point(x=1, y=2)

11 >>> p._asdict()12 OrderedDict([(’x’, 2), (’y’, 3)])

13 >>> p._replace(x=77)14 Point(x=77, y=3)

15 >>> p._fields16 (’x’, ’y’)

Page 28: Palestra sobre Collections com Python

collections.OrderedDict

Page 29: Palestra sobre Collections com Python

OrderedDict

1 >>> d = {’banana’: 3, ’apple’:4, ’pear’: 1, ’orange’: 2}2 >>> print d3 {’orange’: 2, ’pear’: 1, ’banana’: 3, ’apple’: 4}

4 >>> print OrderedDict(sorted(d.items()))5 OrderedDict([(’apple’, 4), (’banana’, 3), (’orange’, 2), (’pear’, 1)])

6 >>> od = OrderedDict(sorted(d.items(), key=lambda k: k[1]))7 >>> print od8 OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3), (’apple’, 4)])

9 >>> od.popitem()10 (’apple’, 4)11 >>> print od12 OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3)])

Page 30: Palestra sobre Collections com Python

OrderedDict

1 >>> d = {’banana’: 3, ’apple’:4, ’pear’: 1, ’orange’: 2}2 >>> print d3 {’orange’: 2, ’pear’: 1, ’banana’: 3, ’apple’: 4}

4 >>> print OrderedDict(sorted(d.items()))5 OrderedDict([(’apple’, 4), (’banana’, 3), (’orange’, 2), (’pear’, 1)])

6 >>> od = OrderedDict(sorted(d.items(), key=lambda k: k[1]))7 >>> print od8 OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3), (’apple’, 4)])

9 >>> od.popitem()10 (’apple’, 4)11 >>> print od12 OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3)])

Page 31: Palestra sobre Collections com Python

OrderedDict

1 >>> d = {’banana’: 3, ’apple’:4, ’pear’: 1, ’orange’: 2}2 >>> print d3 {’orange’: 2, ’pear’: 1, ’banana’: 3, ’apple’: 4}

4 >>> print OrderedDict(sorted(d.items()))5 OrderedDict([(’apple’, 4), (’banana’, 3), (’orange’, 2), (’pear’, 1)])

6 >>> od = OrderedDict(sorted(d.items(), key=lambda k: k[1]))7 >>> print od8 OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3), (’apple’, 4)])

9 >>> od.popitem()10 (’apple’, 4)11 >>> print od12 OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3)])

Page 32: Palestra sobre Collections com Python

OrderedDict

1 >>> d = {’banana’: 3, ’apple’:4, ’pear’: 1, ’orange’: 2}2 >>> print d3 {’orange’: 2, ’pear’: 1, ’banana’: 3, ’apple’: 4}

4 >>> print OrderedDict(sorted(d.items()))5 OrderedDict([(’apple’, 4), (’banana’, 3), (’orange’, 2), (’pear’, 1)])

6 >>> od = OrderedDict(sorted(d.items(), key=lambda k: k[1]))7 >>> print od8 OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3), (’apple’, 4)])

9 >>> od.popitem()10 (’apple’, 4)11 >>> print od12 OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3)])

Page 33: Palestra sobre Collections com Python

collections.abcABC - Abstract Base Class

Page 34: Palestra sobre Collections com Python

abc em 2minutos

1 class AbstractKnight(object):23 __metaclass__ = abc.ABCMeta4 @abc.abstractmethod5 def echo(self):6 pass

6 class IncompKnight(AbstractKnight):7 pass

8 >>> IncompKnight()9 TypeError: Can’t instantiate abstract class IncompKnight10 with abstract methods echo

11 >>> AbstractKnight.__abstractmethods__12 frozenset([’echo’])

13 class KnightImp(AbstractKnight):14 def echo(self):15 print ’Ni’16 >>> KnightImp().echo()17 Ni

Page 35: Palestra sobre Collections com Python

abc em 2minutos

1 class AbstractKnight(object):23 __metaclass__ = abc.ABCMeta4 @abc.abstractmethod5 def echo(self):6 pass

6 class IncompKnight(AbstractKnight):7 pass

8 >>> IncompKnight()9 TypeError: Can’t instantiate abstract class IncompKnight10 with abstract methods echo

11 >>> AbstractKnight.__abstractmethods__12 frozenset([’echo’])

13 class KnightImp(AbstractKnight):14 def echo(self):15 print ’Ni’16 >>> KnightImp().echo()17 Ni

Page 36: Palestra sobre Collections com Python

abc em 2minutos

1 class AbstractKnight(object):23 __metaclass__ = abc.ABCMeta4 @abc.abstractmethod5 def echo(self):6 pass

6 class IncompKnight(AbstractKnight):7 pass

8 >>> IncompKnight()9 TypeError: Can’t instantiate abstract class IncompKnight10 with abstract methods echo

11 >>> AbstractKnight.__abstractmethods__12 frozenset([’echo’])

13 class KnightImp(AbstractKnight):14 def echo(self):15 print ’Ni’16 >>> KnightImp().echo()17 Ni

Page 37: Palestra sobre Collections com Python

abc em 2minutos

1 class AbstractKnight(object):23 __metaclass__ = abc.ABCMeta4 @abc.abstractmethod5 def echo(self):6 pass

6 class IncompKnight(AbstractKnight):7 pass

8 >>> IncompKnight()9 TypeError: Can’t instantiate abstract class IncompKnight10 with abstract methods echo

11 >>> AbstractKnight.__abstractmethods__12 frozenset([’echo’])

13 class KnightImp(AbstractKnight):14 def echo(self):15 print ’Ni’16 >>> KnightImp().echo()17 Ni

Page 38: Palestra sobre Collections com Python

abc em 2minutos

1 class AbstractKnight(object):23 __metaclass__ = abc.ABCMeta4 @abc.abstractmethod5 def echo(self):6 pass

6 class IncompKnight(AbstractKnight):7 pass

8 >>> IncompKnight()9 TypeError: Can’t instantiate abstract class IncompKnight10 with abstract methods echo

11 >>> AbstractKnight.__abstractmethods__12 frozenset([’echo’])

13 class KnightImp(AbstractKnight):14 def echo(self):15 print ’Ni’16 >>> KnightImp().echo()17 Ni

Page 39: Palestra sobre Collections com Python

Herdando dict

1 class Dicto(dict):2 def __getitem__(self, k):3 return 31

4 >>> d = Dicto()5 >>> d[2]6 31

7 >>> print d.get(2)8 None910 D’oh : (

Page 40: Palestra sobre Collections com Python

Herdando dict

1 class Dicto(dict):2 def __getitem__(self, k):3 return 31

4 >>> d = Dicto()5 >>> d[2]6 31

7 >>> print d.get(2)8 None910 D’oh : (

Page 41: Palestra sobre Collections com Python

Herdando dict

1 class Dicto(dict):2 def __getitem__(self, k):3 return 31

4 >>> d = Dicto()5 >>> d[2]6 31

7 >>> print d.get(2)8 None910 D’oh : (

Page 42: Palestra sobre Collections com Python

collections.abc

• subclasses de builtin containers nem sempre produzem resultadosesperados

• subclasses de ABC produzem

Page 43: Palestra sobre Collections com Python

collections.abc

Page 44: Palestra sobre Collections com Python

if you’re lazy

1 # ex: MutableMapping.__abstractmethods__2 for i in dir(collections):3 try:4 meths = list(getattr(collections, i5 ).__abstractmethods__)6 print i, ’->’, meths7 except:8 pass

Callable -> [’__call__’]Container -> [’__contains__’]Hashable -> [’__hash__’]ItemsView -> []Iterable -> [’__iter__’]Iterator -> [’next’]KeysView -> []Mapping -> [’__iter__’, ’__getitem__’, ’__len__’]MappingView -> []MutableMapping -> [’__delitem__’, ’__setitem__’,

’__getitem__’, ’__iter__’, ’__len__’]MutableSequence -> [’__delitem__’, ’__setitem__’,

’__getitem__’, ’__len__’, ’insert’]MutableSet -> [’discard’, ’add’, ’__iter__’,

’__len__’, ’__contains__’]Sequence -> [’__getitem__’, ’__len__’]Set -> [’__iter__’, ’__len__’, ’__contains__’]Sized -> [’__len__’]ValuesView -> []

Page 45: Palestra sobre Collections com Python

Subclassing dict decollections.MutableMapping

1 from collections import MutableMapping23 class Dicto(MutableMapping):45 def __init__(self):6 self.d = {}78 def __delitem__(self, i):9 del self.d[i]1011 def __setitem__(self, k, v):12 self.d[k.lower()] = v1314 def __getitem__(self, k):15 return self.d[k.lower()]1617 def __iter__(self):18 return iter(self.d)1920 def __len__(self):21 return len(self.d)

>>> d = Dicto()>>> d[’eggs’] = ’ovos’>>> d[’ham’] = ’presunto’>>> for i in d:... print i + ’:’ + d[i]eggs:ovosham:presunto>>> d.get(’HaM’)presunto>>> d[’eGGs’]’ovos’

Page 46: Palestra sobre Collections com Python

Subclassing dict decollections.MutableMapping

1 from collections import MutableMapping23 class Dicto(MutableMapping):45 def __init__(self):6 self.d = {}78 def __delitem__(self, i):9 del self.d[i]1011 def __setitem__(self, k, v):12 self.d[k.lower()] = v1314 def __getitem__(self, k):15 return self.d[k.lower()]1617 def __iter__(self):18 return iter(self.d)1920 def __len__(self):21 return len(self.d)

>>> d = Dicto()>>> d[’eggs’] = ’ovos’>>> d[’ham’] = ’presunto’>>> for i in d:... print i + ’:’ + d[i]eggs:ovosham:presunto>>> d.get(’HaM’)presunto>>> d[’eGGs’]’ovos’

Page 47: Palestra sobre Collections com Python

Referência

• Lightning Talk de:

no fisl 2011.• The Data Structures of Python, Alex Gaynor no PyCon2011• http://www.doughellmann.com/PyMOTW/abc/index.html• http://docs.python.org/library/collections.html

Page 48: Palestra sobre Collections com Python

Dúvidas?

André Ericsonhttp://www.github.com/aericson

[email protected]@_aericson