SlideShare une entreprise Scribd logo
1  sur  57
Télécharger pour lire hors ligne
Python Decorators
Yiwei
Syntax Sugar
@some_decorator
def my_func(my_arg1, my_arg2):
......
def my_func(my_arg1, my_arg2):
......
my_func = some_decorator(my_func)
decorator: 一個吃 function 吐 function 的 function
def some_decorator(func):
def wrapper(a1, a2):
print('call '+func.__name__)
return func(a1, a2)
return wrapper
def my_func(my_arg1, my_arg2):
......
my_func = some_decorator(my_func)
大家可以回家啦 (?)
my_func = some_decorator(my_func) # WTF?
function 是一個「東西」
● 可以 assign
● 可以傳進另一個 function
● 可以定義在另一個 function,並回傳之
def f1(n):
print('I am f1')
sum = 0
for i in range(n+1):
sum += i
return sum
f2 = f1
def f1(n):
print('I am f1')
sum = 0
for i in range(n+1):
sum += i
return sum
f2 = f1
print('I am f1')
sum = 0
for i in range(n+1):
sum += i
return sum
f1f2
function 的定義
def f1(n):
print('I am f1')
sum = 0
for i in range(n+1):
sum += i
return sum
f2 = f1
f1 # <function f1 at 0x7f807e6261e0>
f2 # <function f1 at 0x7f807e6261e0>
f2(10) # 55
print('I am f1')
sum = 0
for i in range(n+1):
sum += i
return sum
f1f2
function 的定義
def f(number):
return number*10
def g(func, n):
return func(n)+8
# ⇧目前為止都只是定義,還沒被執行
g(f, 3) # 38
str_list.sort(key=str.lower)
注意不是 str.lower()
def f(number):
return number*10
def g(func, n):
return func(n)+8
# ⇧目前為止都只是定義,還沒被執行
g(f, 3) # 38
def gen_fat_checker(bmi):
bmi_bound = bmi
def f(w, h):
return w/(h*h) > bmi_bound
return f
fat = gen_fat_checker(20)
super_fat = gen_fat_checker(30)
print(fat(80.0, 1.7))
print(super_fat(80.0, 1.7))
def gen_fat_checker(bmi):
bmi_bound = bmi
return f
fat = gen_fat_checker(20) #只拿到函數本體
super_fat = gen_fat_checker(30) #還沒執行 f
print(fat(80.0, 1.7)) #現在才執行
print(super_fat(80.0, 1.7))
f = 敘述 function 要做什麼, 也敘述他吃2個參數
def gen_fat_checker(bmi):
bmi_bound = bmi
def f(w, h):
return w/(h*h) > bmi_bound
return f
def gen_fat_checker(bmi_bound):
def f(w, h):
return w/(h*h) > bmi_bound
return f
my_func = some_decorator(my_func)
function 是一個「東西」
● 可以 assign
● 可以傳進另一個 function
● 可以定義在另一個 function,並回傳之
知道了 function 是頭等公民...
decorator: 一個吃 function 吐 function 的 function
def some_decorator(func):
def wrapper(a1, a2):
print('call '+func.__name__)
return func(a1, a2)
return wrapper
def my_func(m1, m2):
print('{} {}'.format(m1, m2))
return m1 + m2
my_func = some_decorator(my_func)
my_func(5, 8)
Agenda
● Function as a “first-class citizen”
● Why decorator?
● 最簡單的 decorator
● 複雜一點的 decorator
Why decorator?
Query
def query_mysql(sql):
...
return result
res = query_mysql('select *')
Query with retry
def query_mysql(sql):
...
return result
for i in range(5):
try:
res = query_mysql('select *')
except:
sleep(60)
Download with retry
def download_s3(path):
...
return result
for i in range(5):
try:
res = download_s3('s3://a.csv')
except:
sleep(60)
XXXXX with retry
def find_mongo(q):
...
return result
for i in range(5):
try:
res = find_mongo('{f: 1}')
except:
sleep(60)
retry 吃 function (和其參數)
def retry(do_work, work_arg):
for i in range(5):
try:
return do_work(work_arg)
except:
sleep(60)
res = retry(query_mysql, 'select *')
retry 累贅,重點是執行 do_work(work_arg)
def retry(do_work, work_arg):
for i in range(5):
try:
work_res = do_work(work_arg)
return work_res
except:
sleep(60)
retry(query_mysql, 'select *')
retry(download_s3, 's3://a.csv')
retry(find_mongo, '{f: 1}')
重點是執行 do_work(work_arg)
def retry(do_work, work_arg):
for i in range(5):
try:
work_res = do_work(work_arg)
return work_res
except:
sleep(60)
retry(query_mysql, 'select *')
真的在執行
retry_query_mysql( 'select *')
可能寫成這樣嗎?
def retry(do_work) work_arg:
for i in range(5):
try:
work_res = do_work(work_arg)
return work_res
except:
sleep(60)
retry(query_mysql, 'select *')
真的在執行
retry(query_mysql)('select *')
可能寫成這樣嗎?
錯!
def retry(do_work):
def wrapper(work_arg):
for i in range(5):
try:
work_res = do_work(work_arg)
return work_res
except:
sleep(60)
return wrapper
retry(query_mysql)('select *')
只是定義:
吃一個arg的函數
一個吃 function 吐 function 的 function
def retry(do_work):
def wrapper(work_arg):
for i in range(5):
try:
work_res = do_work(work_arg)
return work_res
except:
sleep(60)
return wrapper
retry(query_mysql) #work is not executed
res = retry(query_mysql)('select *')
def retry(do_work):
def wrapper(work_arg):
for i in range(5):
try:
work_res = do_work(work_arg)
return work_res
except:
sleep(60)
return wrapper
res = retry(query_mysql)('select *')
def retry(do_work):
def wrapper(work_arg):
for i in range(5):
try:
work_res = do_work(work_arg)
return work_res
except:
sleep(60)
return wrapper
query_mysql = retry(query_mysql)
res = query_mysql('select *')
和這一個 section 第一頁的
呼叫法一樣了
decorator: syntax sugar
def retry(work):
def wrapper(work_arg):
work(work_arg)
return wrapper
def query_mysql(sql):
...
query_mysql = retry(query_mysql)
res = query_mysql('select *')
如果這 function 有一百行
就很難知道 query_mysql 被改了
def retry(work):
def wrapper(work_arg):
work(work_arg)
return wrapper
@retry
def query_mysql(sql):
...
res = query_mysql('select *')
Syntax Sugar
@decorator
def work():
......
def work():
......
work = decorator(work)
Syntax Sugar
@f2
@f1
def work():
......
def work():
......
work = f2(f1(work))
定義 vs. 使用
@measure_time
@cache
def work(w1):
......
def work(w1):
......
work = measure_time(
cache(
work))
r = work('123')
● 使用方式不變
● 擴充功能:
和黃金聖衣一樣
● 內在不變,但外在
變了
(你的work不是你的work)
def deco(work):
def wrapper(work_arg):
# TRICK BEFORE
work_res = work(work_arg)
# TRICK AFTER
return wrapper
● 根據 arg 來記住結果不執行 work (@lru_cache)
● 計時 work 花多久時間
● assert / verbose / logging
● @app.route(‘/get/<id>/’) 僅回傳 func 本身,同時也記起來
● @property
所以你應該會寫 decorator 給別人用了
def deco(work):
def _wrapper(work_arg):
return work(work_arg)
return _wrapper
def my_work(w1): @deco
... def my_work(w1):
my_work = deco(my_work) ...
res = my_work('123')
最簡單的 decorator
def retry(work):
def wrapper(work_arg):
for i in range(5):
try:
return work(work_arg)
except:
sleep(60)
return wrapper
@retry
def download(file1, file2):
...
事情不是憨人想得這麼簡單
@deco
def work(w1):
...
@deco
def work(w1, w2, w3):
...
@deco(d1=xx)
def work(w1):
...
def deco(work):
def _wrapper(work_arg):
return work(work_arg)
return _wrapper
@deco
def work_a(w1):
@deco
def work_b(w1, w2, w3=None):
1. 不知道使用你 deco 的 function 有多少個參數
def deco(work):
def _wrapper(*args, **kwargs):
return work(*args, **kwargs)
return _wrapper
@deco
def work_a(w1):
@deco
def work_b(w1, w2, w3=None):
就回傳可以吃任意個參數的 wrapper
def deco(work, d_arg1):
def _wrapper(*args, **kwargs):
print(d_arg1)
return work(*args, **kwargs)
return _wrapper
def work_a(w1, w2, w3=None):
...
work_a = deco(work_a, 5)
work_a(11, 22, 33)
2. 想讓 decorator 自身也接受參數
def deco(work, d_arg1):
def _wrapper(*args, **kwargs):
print(d_arg1)
return work(*args, **kwargs)
return _wrapper
def work_a(w1, w2, w3=None):
...
work_a = deco(work_a, 5)
work_a(11, 22, 33)
2. 想讓 decorator 自身也接受參數
可以,
但沒有 syntax sugar
@retry
def download(file):
......
@retry(attempts=5)
def download(file):
......
retry(download)
retry(attempts=5)(download)
藍色的部份,也就是 @ 後面的部份可以視作一個 expression,這個 expression 回傳的東西會被呼叫
def deco(d_arg1):
def _decorator(work):
def _wrapper(*args, **kwargs):
print(d_arg1)
return work(*args, **kwargs)
return _wrapper
return _decorator
def work_a(w1, w2): @deco(5)
... def work_a(w1, w2):
work_a = deco(5)(work_a) ...
work_a(11, 22)
讓 @xxx 獨立於 work 之外
def deco(work):
def _wrapper(*args, **kwargs):
return work(*args, **kwargs)
return _wrapper
deco(my_work)(11, 22)
def p_deco(d_arg1):
def _decorator(work):
def _wrapper(*args, **kwargs):
print(d_arg1)
return work(*args, **kwargs)
return _wrapper
return _decorator
p_deco(42)(my_work)(11, 22) (做了呼叫的) p_deco(42)
是一個吃 work 的 function --
亦即裡面定義的 _decorator
deco
是一個吃 work 的 function
def deco(work):
def _wrapper(*args, **kwargs):
return work(*args, **kwargs)
return _wrapper
@deco
def my_work(w1, w2):
def p_deco(d_arg1):
def _decorator(work):
def _wrapper(*args, **kwargs):
print(d_arg1)
return work(*args, **kwargs)
return _wrapper
return _decorator
@p_deco(42)
def my_work(w1, w2):
多了一層,因為和
“deco” 只是定義相比,
”p_deco(42)” 做了呼叫
Takeaway
my_func = some_decorator(my_func)
function 是一個「東西」
● 可以 assign
● 可以傳進另一個 function
● 可以定義在另一個 function,並回傳之
def retry(do_work):
def wrapper(work_arg):
for i in range(5):
try:
work_res = do_work(work_arg)
return work_res
except:
sleep(60)
return wrapper
retry(query_mysql) #work is not executed
res = retry(query_mysql)('select *')
decorator: syntax sugar
@measure_time
@cache
def work(w1):
......
def work(w1):
......
work = measure_time(
cache(
work))
r = work('123')
● 使用方式不變
● 擴充功能:
和黃金聖衣一樣
● 內在不變,但外在
變了
(你的work不是你的work)
def deco(work):
def _wrapper(*args, **kwargs):
return work(*args, **kwargs)
return _wrapper
@deco
def my_work(w1, w2):
def p_deco(d_arg1):
def _decorator(work):
def _wrapper(*args, **kwargs):
print(d_arg1)
return work(*args, **kwargs)
return _wrapper
return _decorator
@p_deco(42)
def my_work(w1, w2):
大家可以回家啦!
Reference
Reference
● https://www.python.org/dev/peps/pep-0318/ (must see)
● https://docs.python.org/3/reference/compound_stmts.html
#function
● Book “Guide to: learning Python Decorators”
● work 可以動,不代表你的 work 是你的 work
○ print(work.__name__)
○ https://hynek.me/articles/decorators/
○ http://blog.dscpl.com.au/2014/01/how-you-implemented-your-pyth
on.html
○ https://github.com/GrahamDumpleton/wrapt

Contenu connexe

Tendances

Decorators Explained: A Powerful Tool That Should Be in Your Python Toolbelt.
Decorators Explained: A Powerful Tool That Should Be in Your Python Toolbelt.Decorators Explained: A Powerful Tool That Should Be in Your Python Toolbelt.
Decorators Explained: A Powerful Tool That Should Be in Your Python Toolbelt.Samuel Fortier-Galarneau
 
Recursion to iteration automation.
Recursion to iteration automation.Recursion to iteration automation.
Recursion to iteration automation.Russell Childs
 
Python profiling
Python profilingPython profiling
Python profilingdreampuf
 
Decorators in Python
Decorators in PythonDecorators in Python
Decorators in PythonBen James
 
Creating Lazy stream in CSharp
Creating Lazy stream in CSharpCreating Lazy stream in CSharp
Creating Lazy stream in CSharpDhaval Dalal
 
(map Clojure everyday-tasks)
(map Clojure everyday-tasks)(map Clojure everyday-tasks)
(map Clojure everyday-tasks)Jacek Laskowski
 
Коварный code type ITGM #9
Коварный code type ITGM #9Коварный code type ITGM #9
Коварный code type ITGM #9Andrey Zakharevich
 
Python Programming: Data Structure
Python Programming: Data StructurePython Programming: Data Structure
Python Programming: Data StructureChan Shik Lim
 
TCO in Python via bytecode manipulation.
TCO in Python via bytecode manipulation.TCO in Python via bytecode manipulation.
TCO in Python via bytecode manipulation.lnikolaeva
 
C++ L03-Control Structure
C++ L03-Control StructureC++ L03-Control Structure
C++ L03-Control StructureMohammad Shaker
 
ES6 - Next Generation Javascript
ES6 - Next Generation JavascriptES6 - Next Generation Javascript
ES6 - Next Generation JavascriptRamesh Nair
 
Python opcodes
Python opcodesPython opcodes
Python opcodesalexgolec
 
EcmaScript unchained
EcmaScript unchainedEcmaScript unchained
EcmaScript unchainedEduard Tomàs
 

Tendances (20)

Decorators Explained: A Powerful Tool That Should Be in Your Python Toolbelt.
Decorators Explained: A Powerful Tool That Should Be in Your Python Toolbelt.Decorators Explained: A Powerful Tool That Should Be in Your Python Toolbelt.
Decorators Explained: A Powerful Tool That Should Be in Your Python Toolbelt.
 
Recursion to iteration automation.
Recursion to iteration automation.Recursion to iteration automation.
Recursion to iteration automation.
 
Python profiling
Python profilingPython profiling
Python profiling
 
Decorators in Python
Decorators in PythonDecorators in Python
Decorators in Python
 
Creating Lazy stream in CSharp
Creating Lazy stream in CSharpCreating Lazy stream in CSharp
Creating Lazy stream in CSharp
 
Docopt
DocoptDocopt
Docopt
 
(map Clojure everyday-tasks)
(map Clojure everyday-tasks)(map Clojure everyday-tasks)
(map Clojure everyday-tasks)
 
Коварный code type ITGM #9
Коварный code type ITGM #9Коварный code type ITGM #9
Коварный code type ITGM #9
 
C++ L05-Functions
C++ L05-FunctionsC++ L05-Functions
C++ L05-Functions
 
Python Programming: Data Structure
Python Programming: Data StructurePython Programming: Data Structure
Python Programming: Data Structure
 
TCO in Python via bytecode manipulation.
TCO in Python via bytecode manipulation.TCO in Python via bytecode manipulation.
TCO in Python via bytecode manipulation.
 
C++ L04-Array+String
C++ L04-Array+StringC++ L04-Array+String
C++ L04-Array+String
 
C++ L06-Pointers
C++ L06-PointersC++ L06-Pointers
C++ L06-Pointers
 
C++ L03-Control Structure
C++ L03-Control StructureC++ L03-Control Structure
C++ L03-Control Structure
 
CoffeeScript
CoffeeScriptCoffeeScript
CoffeeScript
 
ES6 - Next Generation Javascript
ES6 - Next Generation JavascriptES6 - Next Generation Javascript
ES6 - Next Generation Javascript
 
Python opcodes
Python opcodesPython opcodes
Python opcodes
 
EcmaScript unchained
EcmaScript unchainedEcmaScript unchained
EcmaScript unchained
 
C++ L07-Struct
C++ L07-StructC++ L07-Struct
C++ L07-Struct
 
C++ L01-Variables
C++ L01-VariablesC++ L01-Variables
C++ L01-Variables
 

Similaire à Python decorators (中文)

DjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New RelicDjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New RelicGraham Dumpleton
 
Djangocon11: Monkeying around at New Relic
Djangocon11: Monkeying around at New RelicDjangocon11: Monkeying around at New Relic
Djangocon11: Monkeying around at New RelicNew Relic
 
Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with GroovyArturo Herrero
 
Pydiomatic
PydiomaticPydiomatic
Pydiomaticrik0
 
Funkcija, objekt, python
Funkcija, objekt, pythonFunkcija, objekt, python
Funkcija, objekt, pythonRobert Lujo
 
Fantastic DSL in Python
Fantastic DSL in PythonFantastic DSL in Python
Fantastic DSL in Pythonkwatch
 
User defined functions
User defined functionsUser defined functions
User defined functionsshubham_jangid
 
Currying and Partial Function Application (PFA)
Currying and Partial Function Application (PFA)Currying and Partial Function Application (PFA)
Currying and Partial Function Application (PFA)Dhaval Dalal
 
Testing My Patience
Testing My PatienceTesting My Patience
Testing My PatienceAdam Lowry
 
Python magicmethods
Python magicmethodsPython magicmethods
Python magicmethodsdreampuf
 
Introduction to Functional Programming with Scala
Introduction to Functional Programming with ScalaIntroduction to Functional Programming with Scala
Introduction to Functional Programming with Scalapramode_ce
 
LinkedIn TBC JavaScript 100: Functions
 LinkedIn TBC JavaScript 100: Functions LinkedIn TBC JavaScript 100: Functions
LinkedIn TBC JavaScript 100: FunctionsAdam Crabtree
 
Attributes Unwrapped: Lessons under the surface of active record
Attributes Unwrapped: Lessons under the surface of active recordAttributes Unwrapped: Lessons under the surface of active record
Attributes Unwrapped: Lessons under the surface of active record.toster
 
Python Functions (PyAtl Beginners Night)
Python Functions (PyAtl Beginners Night)Python Functions (PyAtl Beginners Night)
Python Functions (PyAtl Beginners Night)Rick Copeland
 
谈谈Javascript设计
谈谈Javascript设计谈谈Javascript设计
谈谈Javascript设计Alipay
 

Similaire à Python decorators (中文) (20)

DevOps with Fabric
DevOps with FabricDevOps with Fabric
DevOps with Fabric
 
DjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New RelicDjangoCon US 2011 - Monkeying around at New Relic
DjangoCon US 2011 - Monkeying around at New Relic
 
Djangocon11: Monkeying around at New Relic
Djangocon11: Monkeying around at New RelicDjangocon11: Monkeying around at New Relic
Djangocon11: Monkeying around at New Relic
 
Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with Groovy
 
Pydiomatic
PydiomaticPydiomatic
Pydiomatic
 
Python idiomatico
Python idiomaticoPython idiomatico
Python idiomatico
 
Chapter 02 functions -class xii
Chapter 02   functions -class xiiChapter 02   functions -class xii
Chapter 02 functions -class xii
 
2 Functions2.pptx
2 Functions2.pptx2 Functions2.pptx
2 Functions2.pptx
 
Funkcija, objekt, python
Funkcija, objekt, pythonFunkcija, objekt, python
Funkcija, objekt, python
 
Fantastic DSL in Python
Fantastic DSL in PythonFantastic DSL in Python
Fantastic DSL in Python
 
User defined functions
User defined functionsUser defined functions
User defined functions
 
Currying and Partial Function Application (PFA)
Currying and Partial Function Application (PFA)Currying and Partial Function Application (PFA)
Currying and Partial Function Application (PFA)
 
Testing My Patience
Testing My PatienceTesting My Patience
Testing My Patience
 
Python magicmethods
Python magicmethodsPython magicmethods
Python magicmethods
 
Introduction to Functional Programming with Scala
Introduction to Functional Programming with ScalaIntroduction to Functional Programming with Scala
Introduction to Functional Programming with Scala
 
LinkedIn TBC JavaScript 100: Functions
 LinkedIn TBC JavaScript 100: Functions LinkedIn TBC JavaScript 100: Functions
LinkedIn TBC JavaScript 100: Functions
 
Attributes Unwrapped: Lessons under the surface of active record
Attributes Unwrapped: Lessons under the surface of active recordAttributes Unwrapped: Lessons under the surface of active record
Attributes Unwrapped: Lessons under the surface of active record
 
Python : Functions
Python : FunctionsPython : Functions
Python : Functions
 
Python Functions (PyAtl Beginners Night)
Python Functions (PyAtl Beginners Night)Python Functions (PyAtl Beginners Night)
Python Functions (PyAtl Beginners Night)
 
谈谈Javascript设计
谈谈Javascript设计谈谈Javascript设计
谈谈Javascript设计
 

Dernier

Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmSujith Sukumaran
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfkalichargn70th171
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based projectAnoyGreter
 
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
 
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
 
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
 
Software Coding for software engineering
Software Coding for software engineeringSoftware Coding for software engineering
Software Coding for software engineeringssuserb3a23b
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEEVICTOR MAESTRE RAMIREZ
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanyChristoph Pohl
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfFerryKemperman
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Cizo Technology Services
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Angel Borroy López
 
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Matt Ray
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsChristian Birchler
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringHironori Washizaki
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Hr365.us smith
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commercemanigoyal112
 

Dernier (20)

Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalm
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based project
 
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...
 
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort ServiceHot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
 
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
 
Advantages of Odoo ERP 17 for Your Business
Advantages of Odoo ERP 17 for Your BusinessAdvantages of Odoo ERP 17 for Your Business
Advantages of Odoo ERP 17 for Your Business
 
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
 
Software Coding for software engineering
Software Coding for software engineeringSoftware Coding for software engineering
Software Coding for software engineering
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEE
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdf
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
 
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their Engineering
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commerce
 

Python decorators (中文)