SlideShare a Scribd company logo
1 of 70
Download to read 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

More Related Content

Similar to 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
 

Similar to 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
 

Recently uploaded

Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...Christina Lin
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...OnePlan Solutions
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...soniya singh
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptkotipi9215
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)jennyeacort
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfAlina Yurenko
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureDinusha Kumarasiri
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio, Inc.
 

Recently uploaded (20)

Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.ppt
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with Azure
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
 

Metaprogramação em Python: Decorators e Metaclasses