python 装饰器有哪些_Python装饰器有哪些常见用途?
RSabet..
123
我使用裝飾器主要用于計時目的
def time_dec(func):
def wrapper(*arg):
t = time.clock()
res = func(*arg)
print func.func_name, time.clock()-t
return res
return wrapper
@time_dec
def myFunction(n):
...
好例子!不知道它做了什么.解釋你在那里做什么,以及裝飾者如何解決問題將是非常好的. (19認同)
在Unix下,`time.clock()`測量CPU時間.如果你想測量掛鐘時間,你可能想要使用`time.time()`. (11認同)
好吧,它衡量`myFunction`運行所需的時間...... (7認同)
John Fouhy..
95
我用它們進行同步.
import functools
def synchronized(lock):
""" Synchronization decorator """
def wrap(f):
@functools.wraps(f)
def newFunction(*args, **kw):
lock.acquire()
try:
return f(*args, **kw)
finally:
lock.release()
return newFunction
return wrap
正如評論中指出的那樣,從Python 2.5開始,您可以將with語句與threading.Lock(或multiprocessing.Lock自2.6版本)對象結合使用, 以簡化裝飾器的實現:
import functools
def synchronized(lock):
""" Synchronization decorator """
def wrap(f):
@functools.wraps(f)
def newFunction(*args, **kw):
with lock:
return f(*args, **kw)
return newFunction
return wrap
無論如何,你這樣使用它:
import threading
lock = threading.Lock()
@synchronized(lock)
def do_something():
# etc
@synchronzied(lock)
def do_something_else():
# etc
基本上,它只是把lock.acquire()/ lock.release()在函數調用的兩側.
可能是合理的,但裝飾者本質上是混亂的,尤其是.來到你身后的第一年的新手,并嘗試修改你的代碼.簡單地避免這種情況:只需將do_something()將其代碼括在"with lock:"下的塊中,每個人都可以清楚地看到你的目的.裝飾者被那些想要看起來很聰明的人(實際上很多人)大量過度使用,但隨后代碼變成了凡人,并且得到了充實. (17認同)
@TaylerJones,代碼可讀性是我寫作時的最高優先級.每次修改代碼時,代碼讀取次數超過7次.難以理解的代碼(對于新手或在時間壓力下工作的專家)是每次有人訪問源樹時必須支付的技術債務. (17認同)
@KevinJ.Rice約束你的代碼,以便'第一年的新手'可以更好地理解它是可怕的做法.Decorator語法更容易閱讀,并且極大地解耦了代碼. (16認同)
Simon..
68
我使用裝飾器進行類型檢查參數,這些參數通過一些RMI傳遞給我的Python方法.因此,不是重復相同的參數計數,而是一次又一次地異常提升mumbo-jumbo
def myMethod(ID, name):
if not (myIsType(ID, 'uint') and myIsType(name, 'utf8string')):
raise BlaBlaException() ...
我只是宣布
@accepts(uint, utf8string)
def myMethod(ID, name):
...
和accepts()為我做所有的工作.
對于任何有興趣的人,在PEP 318中都有`@ accepted`的實現. (15認同)
我認為有錯字..第一種方法應該接受..你宣稱兩者都是"myMethod" (2認同)
cdleary..
47
裝飾器用于任何您希望透明地"包裝"其他功能的東西.
您可以使用類裝飾器將命名日志添加到類中.
任何足夠通用的功能,你可以"適應"現有的類或功能的行為是公平的裝飾游戲.
Torsten Mare..
24
對于nosetests,您可以編寫一個裝飾器,它提供具有多組參數的單元測試函數或方法:
@parameters(
(2, 4, 6),
(5, 6, 11),
)
def test_add(a, b, expected):
assert a + b == expected
DNS..
23
Twisted庫使用裝飾器與生成器相結合,給出異步函數同步的錯覺.例如:
@inlineCallbacks
def asyncf():
doStuff()
yield someAsynchronousCall()
doStuff()
yield someAsynchronousCall()
doStuff()
使用它,本來可以分解成大量小回調函數的代碼可以很自然地編寫為單個塊,使其更容易理解和維護.
MisterMetaph..
12
當然,一個顯而易見的用途是記錄:
import functools
def log(logger, level='info'):
def log_decorator(fn):
@functools.wraps(fn)
def wrapper(*a, **kwa):
getattr(logger, level)(fn.__name__)
return fn(*a, **kwa)
return wrapper
return log_decorator
# later that day ...
@log(logging.getLogger('main'), level='warning')
def potentially_dangerous_function(times):
for _ in xrange(times): rockets.get_rocket(NUCLEAR=True).fire()
DzinX..
8
我主要用它們來調試(打印一個打印其參數和結果的函數的包裝)和驗證(例如檢查一個參數是否是正確的類型,或者在Web應用程序的情況下,如果用戶有足夠的權限調用一個特定的方法).
luc..
6
我使用以下裝飾器來創建函數threadsafe.它使代碼更具可讀性.它幾乎與John Fouhy提出的類似,但不同之處在于,它只能處理單個函數,并且不需要明確地創建鎖定對象.
def threadsafe_function(fn):
"""decorator making sure that the decorated function is thread safe"""
lock = threading.Lock()
def new(*args, **kwargs):
lock.acquire()
try:
r = fn(*args, **kwargs)
except Exception as e:
raise e
finally:
lock.release()
return r
return new
class X:
var = 0
@threadsafe_function
def inc_var(self):
X.var += 1
return X.var
那真的很危險.方法inc_var()是"線程安全的",因為一次只能有一個人調用它.也就是說,由于該方法對成員變量"var"進行操作,并且可能其他方法也可能對成員變量"var"進行操作,并且這些訪問不是線程安全的,因為鎖不是共享的.以這種方式做事給X類用戶帶來了錯誤的安全感. (5認同)
Nikhil Chell..
5
裝飾器既可用于定義函數的屬性,也可用作修改函數的樣板; 這是可能的,但反直覺的是他們返回完全不同的功能.看看這里的其他響應,似乎最常見的用途之一是限制其他一些進程的范圍 - 無論是日志記錄,分析,安全檢查等.
CherryPy使用對象分派來匹配對象的URL,最終匹配方法.這些方法的裝飾者發出信號,表明CherryPy是否被允許使用這些方法.例如,改編自教程:
class HelloWorld:
...
def secret(self):
return "You shouldn't be here."
@cherrypy.expose
def index(self):
return "Hello world!"
cherrypy.quickstart(HelloWorld())
aatifh..
5
我最近在使用社交網絡Web應用程序時使用它們.對于社區/團體,我應該授予成員資格以創建新的討論并回復您必須成為該特定組成員的消息.所以,我寫了一個裝飾師@membership_required,把它放在我需要的地方.
總結
以上是生活随笔為你收集整理的python 装饰器有哪些_Python装饰器有哪些常见用途?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql数据库导入导出_MySQL数据
- 下一篇: 苹果2022年向开发者支付600亿美元