(2017-01-27) [wta2017] instrospecção e compilação tardia em python (tutorial)

Download (2017-01-27) [WTA2017] Instrospecção e compilação tardia em Python (Tutorial)

Post on 22-Jan-2018

212 views

Category:

Technology

0 download

Embed Size (px)

TRANSCRIPT

  1. 1. WTA2017 So Paulo SP Poli-USP 2017-01-27WTA2017 So Paulo SP Poli-USP 2017-01-27 Instrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobelliniInstrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobellini 1/361/36 Cdigos da apresentao: https://github.com/danilobellini/wta2017 WTA 2017 Workshop de tecnologia adaptativa WTA 2017 Workshop de tecnologia adaptativa Tutorial: Introspeco e compilao tardia em Python Tutorial: Introspeco e compilao tardia em Python
  2. 2. WTA2017 So Paulo SP Poli-USP 2017-01-27WTA2017 So Paulo SP Poli-USP 2017-01-27 Instrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobelliniInstrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobellini 2/362/36 Danilo J. S. BelliniDanilo J. S. Bellini Engenheiro eletricista (Poli-USP) Bacherel em msica / compositor (ECA-USP) Mestre em cincia da computao (IME-USP) Desenvolvedor Python, shell script, Processamento de sinais GIS (Geographic Information System) FLOSS developer Projetos: AudioLazy Dose Contribuies: IPython watchdog py.test openModeller https://github.com/danilobellini https://bitbucket.org/danilobellini https://br.linkedin.com/in/danilo-j-s-bellini-66a96310 https://ericstk.wordpress.com/2014/10/16 Vejam tambm o material do tutorial do WTA2015!Vejam tambm o material do tutorial do WTA2015!
  3. 3. WTA2017 So Paulo SP Poli-USP 2017-01-27WTA2017 So Paulo SP Poli-USP 2017-01-27 Instrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobelliniInstrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobellini 3/363/36 PythonPython Linguagem multiparadigma Possui recursos de metaprogramao Cientfico, GUI, Web, games, GIS, scraping, hackery, Compilada e interpretada! Python is a programming language that lets you work quickly and integrate systems more effectively. https://www.python.orghttps://www.python.org
  4. 4. WTA2017 So Paulo SP Poli-USP 2017-01-27WTA2017 So Paulo SP Poli-USP 2017-01-27 Instrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobelliniInstrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobellini 4/364/36 SumrioSumrio Dicionrios Objetos Escopo / Closure Compilao AST
  5. 5. WTA2017 So Paulo SP Poli-USP 2017-01-27WTA2017 So Paulo SP Poli-USP 2017-01-27 Instrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobelliniInstrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobellini 5/365/36 Parte 1Parte 1 DicionriosDicionrios
  6. 6. WTA2017 So Paulo SP Poli-USP 2017-01-27WTA2017 So Paulo SP Poli-USP 2017-01-27 Instrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobelliniInstrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobellini 6/366/36 Dicionrio / dictDicionrio / dict Pares chave-valor, mapeia cada chave em um valor Permite aninhamento e reentrncia Unhashable, mas as chaves devem ser sempre hashable In [1]: d = {"nome": "Danilo", ...: "twitter": "@danilobellini"} In [2]: d["nome"] Out[2]: 'Danilo' In [3]: del d["twitter"] In [4]: len(d) # Tamanho (nmero de pares) Out[4]: 1 In [5]: d["sobrenome"] = "J. S. Bellini" In [6]: d["sobrenome"] = d["sobrenome"].split()[-1] In [7]: d Out[7]: {'nome': 'Danilo', 'sobrenome': 'Bellini'} In [1]: d = {"nome": "Danilo", ...: "twitter": "@danilobellini"} In [2]: d["nome"] Out[2]: 'Danilo' In [3]: del d["twitter"] In [4]: len(d) # Tamanho (nmero de pares) Out[4]: 1 In [5]: d["sobrenome"] = "J. S. Bellini" In [6]: d["sobrenome"] = d["sobrenome"].split()[-1] In [7]: d Out[7]: {'nome': 'Danilo', 'sobrenome': 'Bellini'}
  7. 7. WTA2017 So Paulo SP Poli-USP 2017-01-27WTA2017 So Paulo SP Poli-USP 2017-01-27 Instrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobelliniInstrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobellini 7/367/36 Mtodos e operadoresMtodos e operadores O dict no possui ordenao! collections.OrderedDict Ordered != Sorted As chaves so como um conjunto Hash Ordenao Iterao nas chaves list({1: 2}) == [1] dict.items() Itera por pares chave, valor dict.keys() Itera por chaves dict.values() Itera por valores No Python 2, esses mtodos devolvem listas ao invs de iterveis tardios (mas h mtodos equivalentes, com o prefixo iter)
  8. 8. WTA2017 So Paulo SP Poli-USP 2017-01-27WTA2017 So Paulo SP Poli-USP 2017-01-27 Instrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobelliniInstrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobellini 8/368/36 Dunders que permitem criar objetos que se comportam como dicionrios Operador [] In [1]: class LogDict(dict): ...: ...: def __getitem__(self, key): ...: print("__getitem__: {}".format(locals())) ...: return super(LogDict, self).__getitem__(key) ...: ...: def __setitem__(self, key, value): ...: print("__setitem__: {}".format(locals())) ...: super(LogDict, self).__setitem__(key, value) ...: ...: def __delitem__(self, key): ...: print("__delitem__: {}".format(locals())) ...: super(LogDict, self).__delitem__(key) In [2]: logd = LogDict({1: 1, 2: 2, 3: 3}) In [3]: del logd[1] __delitem__: {'self': {1: 1, 2: 2, 3: 3}, 'key': 1} In [4]: logd[2] += logd[3] __getitem__: {'self': {2: 2, 3: 3}, 'key': 2} __getitem__: {'self': {2: 2, 3: 3}, 'key': 3} __setitem__: {'self': {2: 2, 3: 3}, 'key': 2, 'value': 5} In [5]: logd Out[5]: __getitem__: {'self': {2: 5, 3: 3}, 'key': 2} __getitem__: {'self': {2: 5, 3: 3}, 'key': 3} {2: 5, 3: 3} In [1]: class LogDict(dict): ...: ...: def __getitem__(self, key): ...: print("__getitem__: {}".format(locals())) ...: return super(LogDict, self).__getitem__(key) ...: ...: def __setitem__(self, key, value): ...: print("__setitem__: {}".format(locals())) ...: super(LogDict, self).__setitem__(key, value) ...: ...: def __delitem__(self, key): ...: print("__delitem__: {}".format(locals())) ...: super(LogDict, self).__delitem__(key) In [2]: logd = LogDict({1: 1, 2: 2, 3: 3}) In [3]: del logd[1] __delitem__: {'self': {1: 1, 2: 2, 3: 3}, 'key': 1} In [4]: logd[2] += logd[3] __getitem__: {'self': {2: 2, 3: 3}, 'key': 2} __getitem__: {'self': {2: 2, 3: 3}, 'key': 3} __setitem__: {'self': {2: 2, 3: 3}, 'key': 2, 'value': 5} In [5]: logd Out[5]: __getitem__: {'self': {2: 5, 3: 3}, 'key': 2} __getitem__: {'self': {2: 5, 3: 3}, 'key': 3} {2: 5, 3: 3} https://docs.python.org/reference/datamodel.html __getitem__ __setitem__ __delitem__ __getitem__ __setitem__ __delitem__
  9. 9. WTA2017 So Paulo SP Poli-USP 2017-01-27WTA2017 So Paulo SP Poli-USP 2017-01-27 Instrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobelliniInstrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobellini 9/369/36 __missing____missing__ Chaves que no pertencem ao dicionrio Fallback No altera o dicionrio In [1]: class FibDict(dict): ...: ...: def __missing__(self, key): ...: if key < 0: ...: raise KeyError(key) ...: return self[key - 1] + self[key - 2] In [2]: fibd = FibDict({0: 0, 1: 1}) In [3]: fibd[2], fibd[3], fibd[4], fibd[5], fibd[6], fibd[7] Out[3]: (1, 2, 3, 5, 8, 13) In [4]: fibd Out[4]: {0: 0, 1: 1} In [5]: fibd[-1] [...] KeyError: -1 In [6]: 3 in fibd Out[6]: False In [1]: class FibDict(dict): ...: ...: def __missing__(self, key): ...: if key < 0: ...: raise KeyError(key) ...: return self[key - 1] + self[key - 2] In [2]: fibd = FibDict({0: 0, 1: 1}) In [3]: fibd[2], fibd[3], fibd[4], fibd[5], fibd[6], fibd[7] Out[3]: (1, 2, 3, 5, 8, 13) In [4]: fibd Out[4]: {0: 0, 1: 1} In [5]: fibd[-1] [...] KeyError: -1 In [6]: 3 in fibd Out[6]: False Pode-se, dentro do __missing__: Armazenar o resultado (cache) Modificar o prprio dicionrio Lanar exceo (e.g. KeyError)
  10. 10. WTA2017 So Paulo SP Poli-USP 2017-01-27WTA2017 So Paulo SP Poli-USP 2017-01-27 Instrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobelliniInstrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobellini 10/3610/36 Parte 2Parte 2 ObjetosObjetos
  11. 11. WTA2017 So Paulo SP Poli-USP 2017-01-27WTA2017 So Paulo SP Poli-USP 2017-01-27 Instrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobelliniInstrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobellini 11/3611/36 Dicionrio da instnciaDicionrio da instncia Em Python, tudo objeto! O namespace de atributos (dicionrio da instncia) pode ser coletado com o built-in vars Acessa o contedo de obj.__dict__ No aplicvel em built-ins e objetos com __slots__ In [1]: class Usurio(object): ...: ...: def __init__(self, nome, twitter=None): ...: self.nome = nome ...: self.twitter = twitter In [2]: obj = Usurio("Danilo", "@danilobellini") In [3]: obj.nome Out[3]: 'Danilo' In [4]: vars(obj) Out[4]: {'nome': 'Danilo', 'twitter': '@danilobellini'} In [5]: vars(obj) is obj.__dict__ Out[5]: True In [1]: class Usurio(object): ...: ...: def __init__(self, nome, twitter=None): ...: self.nome = nome ...: self.twitter = twitter In [2]: obj = Usurio("Danilo", "@danilobellini") In [3]: obj.nome Out[3]: 'Danilo' In [4]: vars(obj) Out[4]: {'nome': 'Danilo', 'twitter': '@danilobellini'} In [5]: vars(obj) is obj.__dict__ Out[5]: True
  12. 12. WTA2017 So Paulo SP Poli-USP 2017-01-27WTA2017 So Paulo SP Poli-USP 2017-01-27 Instrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobelliniInstrospeco e compilao tardia em Python Danilo J. S. Bellini @danilobellini 12/3612/36 In [6]: dir(obj) Out[6]: ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', In [6]: dir(obj) Out[6]: ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', In [7]: type(obj) Out[7]: __main__.Usurio In [8]: vars(Usurio) Out[8]: mappingproxy({'__dict__': , '