SlideShare uma empresa Scribd logo
1 de 70
Baixar para ler offline
metaprogramação
em python:
metaclass e decorators
@felipevolpone
github.com/felipevolpone
felipevolpone.com
agenda
por que aprender metaprogramação?
decorators
metaclasses
usando o inspect
perguntas
por que
metaprogramação?
aprender
por que
é poderoso
conhecimento
reutilizar código
aumentar abstração
criar APIs mais ricas
decorators
https://www.python.org/dev/peps/pep-0318/
python 2.4
o que é
!
!
@staticmethod	
def	say_hello():	
				return	"Hello	Python	Brasil	:)"	
!
!
@app.route('/')	
def	hello_rest():	
								return	"Hello	folks	:)"
funções são objetos
de primeira classe
como funciona
def	do_nothing(func):	
				def	internal():	
								return	func()	
				return	internal	
!
@do_nothing	
def	foo():	
				return	"bar"	
!
print	foo()	
>	"bar"
#decorator	
def	example(func):	
			…	
!
#@example	
def	foo():	
				return	"bar"	
!
foo	=	example(foo)	
!
print	foo()	
>	"bar"
#@example	
def	foo():	
				return	"bar"	
!
foo	=	example(foo)
def	example(func):	
				def	internal():	
								return	func()	
				return	internal	
!
#@example	
def	foo():	
				return	"bar"	
!
foo	=	example(foo)
def	example(func):	
				def	internal():	
								return	func()	
				return	internal	
!
#@example	
def	foo():	
				return	"bar"	
!
foo	=	example(foo)
def	example(func):	
				def	internal():	
								return	func()	
				return	internal	
!
#@example	
def	foo():	
				return	"bar"	
!
foo	=	example(foo)
def	example(func):	
				def	internal():	
								return	func()	
				return	internal	
!
#@example	
def	foo():	
				return	"bar"	
!
foo	=	log(foo)
def	example(func):	
				def	internal():	
								return	func()	
				return	internal	
!
#@example	
def	foo():	
				return	"bar"	
!
foo	=	example(foo)
}
print	foo	
<function	foo	at	0x105909c80>	
!
foo	=	example(foo)	
print	foo	
<function	internal	at	0x105909cf8>
def	example(func):	
				def	internal():	
								return	func()	
				return	internal	
!
#@example	
def	foo():	
				return	"bar"	
!
foo	=	example(foo)	
print	foo()
def	example(func):	
				def	internal():	
								return	func()	
				return	internal	
!
def	foo():	
				return	"bar"	
!
foo	=	example(foo)	
print	foo()	
>	"Hello"
def	example(func):	
				def	internal():	
								return	func()	
				return	internal	
!
def	foo():	
				return	"bar"	
!
foo	=	example(foo)	
print	foo()	
>	"Hello"
def	example(func):	
				def	internal():	
								return	func()	
				return	internal	
!
@example	
def	foo():	
				return	"bar"	
!
print	foo()	
>	"Hello"
from	datetime	import	datetime	
!
def	log(func):	
				def	internal():	
								now	=	datetime.now()		
	 	 	 	 	 	 	 	.strftime(“%d/%m/%Y	%H:%M:%S")	
								print	"Funcao	chamada:	%s	as	%s"	%							
														(func.func_name,	now)	
								return	func()	
					
				return	internal	
!
print	foo()	
>	"Funcao	chamada:	foo	as	5/11/2015	
16:45:36"	
>	"bar"
def	log(func):	
	 	 def	internal():	
	 	 	 now	=	…								
	 	 	 print	"Funcao	chamada	..."	
	 	 	 return	func()					
	 	 return	internal	
!
@log	
def	say(message):	
				return	message	
@log	
def	goodbye():	
				return	“goodbye"	
!
print	goodbye()	
>	Funcao	chamada:	goodbye	as	5/11/2015	16:30:23	
>	goodbye	
print	say("Python	Brasil")	
>	TypeError:	internal()	takes	no	arguments	(1	given)
!
def	log(func):	
	 	 def	internal(*args,	**kwargs):	
	 	 	 now	=	…	
	 	 	 print	"Funcao	chamada:	…"		
	 	 	 return	func(*args,	**kwargs)	
		
	 	 return	internal
args é iterável
kwargs é {}
def	example(func):	
				def	internal(*args,	**kwargs):	
							return	func(*args,	**kwargs)	
				return	internal	
!
@example	
def	sum_base(a,	b,	base=12):	
				return	a+b+base	
!
print	sum_base(6,	10,	base=12)	
>	28
def	example(func):	
				def	internal(*args,	**kwargs):	
								print	args,	type(args)	
								print	kwargs,	type(kwargs)	
								return	func(*args,	**kwargs)	
				return	internal	
!
@example	
def	sum_base(a,	b,	base=12):	
				return	a+b+base	
!
print	sum_base(6,	10,	base=12)	
>	(6,	10)	<type	'tuple'>	
>	{'base':	12}		<type	'dict'>	
>	28
combinando
@decorators
def	timestamp(func):	
				def	internal(*args,	**kwargs):	
								print	"funcao	chamada	em	%s"	%	(datetime.now())	
								return	func(*args,	**kwargs)	
				return	internal	
!
def	log(func):	
				def	internal(*args,	**kwargs):	
								print	func	
								return	func(*args,	**kwargs)	
				return	internal	
!
@timestamp	
@log	
def	somar(a,b,base=12):	
				return	a+b+base	
!
print	somar(6,	7,	base=12)	
>	funcao	chamada	em	2015-07-17	17:32:48.209305	
>	<function	somar	at	0x100872cf8>	
>	25
@timestamp	
@log	
def	sum_base(a,b,base=12):	
				return	a+b+base	
!
sum_base	=	timestamp(log(sum_base))
!
@app.route('/about')	
def	about():	
				return	'The	about	page'	
!
!
@unittest.skip('Failing	test')	
def	test_example(self):	
				self.assertEquals(1,	2)	
!
def	authentication(msg):	
				def	decorator(func):	
								def	internal(*args,	**kwargs):	
												user	=	get_session_user()	
												if	user.valid:	
																return	func(*args,	**kwargs)	
												else:	
																raise	Exception(msg)	
								return	internal	
!
				return	decorator
@authentication("User	is	not	valid")	
def	say_hello():	
				return	"Hello"	
!
say_hello	=		
authentication(“User	is	not	valid")(say_hello)	
!
print	say_hello()	
>	"Hello”	
!
#quando	usuario	nao	eh	valido	
print	say_hello()	
>	raise	Exception(msg)	
Exception:	User	is	not	valid
@json	
@flask.get('/products/')	
def	products():	
				return	{'products':	get_products()}	
!
@html	
def	get_static_file(file_path):	
				return	open(file_path)	
!
@auth('admin')	
def	delete_user():	
	 	 ...	
!
@convert_object	
@app.post('/user')	
def	get_user(model_user)	
				#	transforma	json	em	objeto	python	
				model_user.put()
cobre 90%
dos casos
def	example(func):	
				def	internal(*args,	**kwargs):	
								"""Useless	decorator"""	
								return	func(*args,	**kwargs)	
				return	internal	
!
@example	
def	say_hello():	
				"""A	simple	function	that	says	hello"""	
				return	"Hello"	
!
print	say_hello.func_name	
print	say_hello.func_doc	
>	"internal"	
>	"Useless	decorator"
def	example(func):	
				def	internal(*args,	**kwargs):	
								"Useless	decorator"	
								return	func(*args,	**kwargs)	
				internal.func_name	=	func.func_name	
				internal.func_doc	=	func.func_doc	
				return	internal	
!
@example	
def	say_hello():	
				"Function	that	says	hello"	
				return	"Hello"	
!
print	say_hello.func_name,	say_hello.func_doc	
>	“say_hello"	"Function	that	says	hello"
from	functools	import	wraps	
!
def	example(func):	
	 	 @wraps(func)	
				def	internal(*args,	**kwargs):	
								"Useless	decorator"	
								return	func(*args,	**kwargs)	
			return	internal	
!
@example	
def	say_hello():	
				"Function	that	says	hello"	
				return	"Hello"	
!
print	say_hello.func_name,	say_hello.func_doc	
>	“say_hello"	"Function	that	says	hello"
from	functors	import	wraps	
!
def	example(func):	
	 	 @wraps(func)	
				def	internal(*args,	**kwargs):	
								"Useless	decorator"	
								return	func(*args,	**kwargs)	
			return	internal	
!
@example	
def	say_hello():	
				"Function	that	says	hello"	
				return	"Hello"	
!
print	say_hello.func_name,	say_hello.func_doc	
>	“say_hello"	"Function	that	says	hello"
/usr/lib/python2.7/functools.py	
!
WRAPPER_ASSIGNMENTS	=	('__module__',	'__name__',	‘__doc__')
import wrapt
http://pyvideo.org/video/2617/advanced-methods-for-creat
import	wrapt	
!
@wrapt.decorator	
def	example(func):	
				def	internal(*args,	**kwargs):	
								"Useless	decorator"	
								return	func(*args,	**kwargs)	
				return	internal
metaclasses
entendendo
classes
objetos de primeira classe
class	User(object):	
				pass	
!
print	dir(User),	User.__dict__	
!
>	['__class__',	'__doc__','__getattribute__',		
	'__hash__',	'__init__',	'__module__',	'__new__',		
	'__repr__',	'__setattr__',	'__sizeof__',	‘__str__’]	
!
>	{'__dict__':	<attribute	'__dict__'	of	'User'	objects>,	
'__module__':	'__main__',		
	'__weakref__':	<attribute	'__weakref__'	of	'User'	objects>,	
'__doc__':	None}
@staticmethod	
def	hello():	
				print	'hello'	
!
User.our_method	=	hello	
User.our_method()
objetos de primeira classe
https://docs.python.org/2/library/functions.html#type
def	init(instance,	name):	
				instance.name	=	name	
				instance.track	=	'web'	
!
EventRuntime	=		
type('Event',	(object,),	{'__init__':	init})	
u	=	EventRuntime('PythonBrasil[11]')	
!
print	u.name	
>	“PythonBrasil[11]“	
print	u.track	
>	"web"	
print	type(u)	
>	<class	'__main__.Event'>
'pythonbrasil'.__class__	
>	str	
!
type('pythonbrasil')	
>	str	
!
isinstance('2015',str)	
>	True
a	=	User()	
!
type(a)	
>	'__main__.User'
type(User)	
>	type	
!
type(str)	
>	type
metaclass class
class
class
isinstance(User,	type)	
>	True	
!
isinstance(str,	type)	
>	True
User type
metaclass class
instance
str
instance
type
user
instance
instance
"pybr11"
instance
__call__ __init__
__new__
instância
user = User()
metaclassclass
1
3 2
4
__call____init__
1.1
1.2
!
class	Log(type):	
				pass	
!
class	Example(object):	
				__metaclass__	=	Log	
!
class	Log(type):	
				pass	
!
class	Example(metaclass=Log):	
				pass	
2.x
3.x
class	MyMetaclass(type):	
				pass	
!
class	Person(object):	
				__metaclass__	=	MyMetaclass	
!
print	type(Person)	
>	<class	'__main__.	MyMetaclass'>
exemplos
1.
import	inspect	
!
def	log(func):	
	 		@wraps(func)	
				def	inner(*args,	**kwargs):	
								print	'[LOG]	%s	was	called'	%	(func.func_name,)	
								return	func(*args,	**kwargs)	
				return	inner	
!
class	Log(type):	
!
				def	__init__(cls,	*args,	**kwargs):	
								for	prop	in	args[2]:	
												method	=	getattr(cls,	prop)	
!
												if	inspect.ismethod(method):	
																decorated_method	=	log(method)	
																setattr(cls,	prop,	decorated_method)	
!
								return	type.__init__(cls,	*args,	**kwargs)
class	Person(object):	
				__metaclass__	=	Log	
!
				def	say(self):	
								return	'hi'	
!
p	=	Person()	
print	p.say()	
>	"[LOG]	say	function	called"	
>	"hi"
2.
pessoa_json	=	{'name':	'felipe',	'age':	22}
class	Pessoa(object):	
			def	__init__(self,	name,	age):
nova_pessoa	=	Pessoa()	
for	key,	value	in	pessoa_json.items():	
				setattr(nova_pessoa,	key,	value)
import	inspect	
!
!
class	ModelProtocol(type):	
!
				def	__new__(cls,	name,	parents,	properties):	
!
								if	'__init__'	in	properties:	
												init_function	=	properties['__init__']	
												init_inspection	=	inspect.getargspec(init_function)	
!
												if	init_inspection.defaults	is	None	and	
len(init_inspection.args)	>	1:	
																raise	Exception(‘The	object	must	have	a	keywords	
arguments	in	__init__')	
!
								return	type.__new__(cls,	name,	parents,	properties)
import	inspect	
!
!
class	ModelProtocol(type):	
!
				def	__new__(cls,	name,	parents,	dct):	
!
								if	'__init__'	in	dct:	
												init_function	=	dct['__init__']	
												init_inspection	=	inspect.getargspec(init_function)	
!
												if	init_inspection.defaults	is	None	and	
len(init_inspection.args)	>	1:	
																raise	Exception(‘The	object	must	have	a	keywords	
arguments	in	__init__')	
!
								return	type.__new__(cls,	name,	parents,	dct)	
ArgSpec(args=['self',	‘name'],	varargs=None,	keywords=None,	defaults=None)
class	User(object):	
				__metaclass__	=	ModelProtocol	
!
				def	__init__(self,	name,	age):	
								pass
class	User(object):	
				__metaclass__	=	ModelProtocol	
!
				def	__init__(self,	name=None,	age=18):	
								pass
class	User(object):	
				__metaclass__	=	ModelProtocol	
!
				def	__init__(self,	name,	age):	
								pass	
!
any_user	=	User('speaker',	22)	
>	Exception:	A	modelobject	must	have		
a	keywords	arguments	in	__init__
class	User(object):	
				__metaclass__	=	ModelProtocol	
!
				def	__init__(self,	name=None,	age=18):	
	 	 	 ...			
!
user_json	=	{'name':	'felipe',	'age':	22}	
new_user	=	User()	
for	key,	value	in	user_json.items():	
				setattr(new_user,	key,	value)	
!
print	new_user.name,	new_user.age	
>	"felipe	22"
!
user_json	=	{'name':	'felipe',	'age':	22}	
!
def	to_instance(clazz,	object_json):	
				instance	=	clazz()	
				for	prop,	value	in	object_json.items():	
								if	prop	in	instance.__dict__:	
												setattr(instance,	prop,	value)	
				return	instance	
!
new_user	=	to_instance(User,	user_json)
descriptors
https://speakerdeck.com/ramalho/python-encapsulation-with-descriptors-1
from	google.appengine.ext	import	ndb	
!
class	Event(ndb.Model):	
				name	=	ndb.StringProperty(required=True)	
				description	=	ndb.TextProperty(required=True)	
				logo	=	ndb.BlobKeyProperty(default=None)	
				date	=	ndb.DateTimeProperty()
@felipevolpone
felipevolpone.com

Mais conteúdo relacionado

Semelhante a Metaprogramação em Python: Decorators e Metaclasses

F# and functional programming
F# and functional programmingF# and functional programming
F# and functional programmingramikarjalainen
 
Python Functions 1
Python Functions 1Python Functions 1
Python Functions 1gsdhindsa
 
Building Interpreters with PyPy
Building Interpreters with PyPyBuilding Interpreters with PyPy
Building Interpreters with PyPyDaniel Neuhäuser
 
Python: an introduction for PHP webdevelopers
Python: an introduction for PHP webdevelopersPython: an introduction for PHP webdevelopers
Python: an introduction for PHP webdevelopersGlenn De Backer
 
Scala in practice - 3 years later
Scala in practice - 3 years laterScala in practice - 3 years later
Scala in practice - 3 years laterpatforna
 
Scala in-practice-3-years by Patric Fornasier, Springr, presented at Pune Sca...
Scala in-practice-3-years by Patric Fornasier, Springr, presented at Pune Sca...Scala in-practice-3-years by Patric Fornasier, Springr, presented at Pune Sca...
Scala in-practice-3-years by Patric Fornasier, Springr, presented at Pune Sca...Thoughtworks
 
Drupal 8: A story of growing up and getting off the island
Drupal 8: A story of growing up and getting off the islandDrupal 8: A story of growing up and getting off the island
Drupal 8: A story of growing up and getting off the islandAngela Byron
 
Refactoring Workshop (Rails Pacific 2014)
Refactoring Workshop (Rails Pacific 2014)Refactoring Workshop (Rails Pacific 2014)
Refactoring Workshop (Rails Pacific 2014)Bruce Li
 
Php training100%placement-in-mumbai
Php training100%placement-in-mumbaiPhp training100%placement-in-mumbai
Php training100%placement-in-mumbaivibrantuser
 
PHP Basics and Demo HackU
PHP Basics and Demo HackUPHP Basics and Demo HackU
PHP Basics and Demo HackUAnshu Prateek
 
Incredible Machine with Pipelines and Generators
Incredible Machine with Pipelines and GeneratorsIncredible Machine with Pipelines and Generators
Incredible Machine with Pipelines and Generatorsdantleech
 
Motion Django Meetup
Motion Django MeetupMotion Django Meetup
Motion Django MeetupMike Malone
 
Exakat for PHP : smart code reviewing engine
Exakat for PHP : smart code reviewing engineExakat for PHP : smart code reviewing engine
Exakat for PHP : smart code reviewing engineDamien Seguy
 

Semelhante a Metaprogramação em Python: Decorators e Metaclasses (20)

F# and functional programming
F# and functional programmingF# and functional programming
F# and functional programming
 
Python master class part 1
Python master class part 1Python master class part 1
Python master class part 1
 
Python Functions 1
Python Functions 1Python Functions 1
Python Functions 1
 
Building Interpreters with PyPy
Building Interpreters with PyPyBuilding Interpreters with PyPy
Building Interpreters with PyPy
 
Python: an introduction for PHP webdevelopers
Python: an introduction for PHP webdevelopersPython: an introduction for PHP webdevelopers
Python: an introduction for PHP webdevelopers
 
Scala in practice - 3 years later
Scala in practice - 3 years laterScala in practice - 3 years later
Scala in practice - 3 years later
 
Scala in-practice-3-years by Patric Fornasier, Springr, presented at Pune Sca...
Scala in-practice-3-years by Patric Fornasier, Springr, presented at Pune Sca...Scala in-practice-3-years by Patric Fornasier, Springr, presented at Pune Sca...
Scala in-practice-3-years by Patric Fornasier, Springr, presented at Pune Sca...
 
2009-02 Oops!
2009-02 Oops!2009-02 Oops!
2009-02 Oops!
 
Drupal 8: A story of growing up and getting off the island
Drupal 8: A story of growing up and getting off the islandDrupal 8: A story of growing up and getting off the island
Drupal 8: A story of growing up and getting off the island
 
Refactoring Workshop (Rails Pacific 2014)
Refactoring Workshop (Rails Pacific 2014)Refactoring Workshop (Rails Pacific 2014)
Refactoring Workshop (Rails Pacific 2014)
 
Php training100%placement-in-mumbai
Php training100%placement-in-mumbaiPhp training100%placement-in-mumbai
Php training100%placement-in-mumbai
 
PHP Basics and Demo HackU
PHP Basics and Demo HackUPHP Basics and Demo HackU
PHP Basics and Demo HackU
 
Incredible Machine with Pipelines and Generators
Incredible Machine with Pipelines and GeneratorsIncredible Machine with Pipelines and Generators
Incredible Machine with Pipelines and Generators
 
Spl in the wild
Spl in the wildSpl in the wild
Spl in the wild
 
Php extensions
Php extensionsPhp extensions
Php extensions
 
Motion Django Meetup
Motion Django MeetupMotion Django Meetup
Motion Django Meetup
 
Having Fun Programming!
Having Fun Programming!Having Fun Programming!
Having Fun Programming!
 
Exakat for PHP : smart code reviewing engine
Exakat for PHP : smart code reviewing engineExakat for PHP : smart code reviewing engine
Exakat for PHP : smart code reviewing engine
 
Functional programming in C++
Functional programming in C++Functional programming in C++
Functional programming in C++
 
lab4_php
lab4_phplab4_php
lab4_php
 

Último

Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Steffen Staab
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsAndolasoft Inc
 
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female serviceCALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female serviceanilsa9823
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️anilsa9823
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxbodapatigopi8531
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...harshavardhanraghave
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AIABDERRAOUF MEHENNI
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...Health
 

Último (20)

Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female serviceCALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptx
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 

Metaprogramação em Python: Decorators e Metaclasses