日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python if后面要不要加括号_Python装饰器兼容加括号与不加括号的写法

發布時間:2024/9/30 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python if后面要不要加括号_Python装饰器兼容加括号与不加括号的写法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用Django的時候,我發現一個很神奇的裝飾器:@login_required, 這是控制一個view的權限的,比如一個視圖必須登錄才可以訪問,可以這樣用:

1

2

3

4

@login_required

defmy_view(request):

...

returnrender(...)

同時,如果要達到這樣一種效果:如果用戶沒有登錄,那么就把用戶重定向到登錄界面,可以這樣用:

1

2

3

4

@login_required(login_url='/accounts/login/')

defmy_view(request):

...

returnrender(...)

所以這個裝飾器可以帶括號寫,又可以不帶括號寫。很神奇有沒有。正常的接收參數的裝飾器,就算沒參數也應該寫成@login_required的

好奇去查了一下,在stackoverflow找到一種實現,挺有意思的。先曬出答案:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

defdoublewrap(f):

'''

a decorator decorator, allowing the decorator to be used as:

@decorator(with, arguments, and=kwargs)

or

@decorator

'''

@wraps(f)

defnew_dec(*args,**kwargs):

iflen(args)==1andlen(kwargs)==0andcallable(args[0]):

# actual decorated function

returnf(args[0])

else:

# decorator arguments

returnlambdarealf:f(realf,*args,**kwargs)

returnnew_dec

使用起來很簡單,只要給裝飾器用@doublewrap裝飾一下,這個裝飾器就支持寫括號和不寫括號兩種寫法了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

deftest_doublewrap():

fromutilimportdoublewrap

fromfunctoolsimportwraps

@doublewrap

defmult(f,factor=2):

'''multiply a function's return value'''

@wraps(f)

defwrap(*args,**kwargs):

returnfactor*f(*args,**kwargs)

returnwrap

# try normal

@mult

deff(x,y):

returnx+y

# try args

@mult(3)

deff2(x,y):

returnx*y

# try kwargs

@mult(factor=5)

deff3(x,y):

returnx-y

assertf(2,3)==10

assertf2(2,5)==30

assertf3(8,1)==5*7

原理也不難,只有短短不到10行代碼。

裝飾器我們都知道,是用來處理一個函數,返回一個新的函數的(如果你不理解裝飾器,可以看一下這個經典的解釋)。

1

new_func=decorator(func)

我們使用的,就是被裝飾器裝飾的新函數了。裝飾器只是一個語法糖,其實它也是一個函數,給它傳入一個函數作為參數,就返回一個新的函數。那么既然裝飾器也是一個函數,我們就可以用裝飾器裝飾這個函數。也就是,“裝飾器的裝飾器”。

裝飾器第一個參數肯定是原函數,如果裝飾器可以接收參數的話,要么第一個參數是原函數,后面跟別的參數;要么就只有原函數一個參數。所以,我們這個“裝飾器的裝飾器”做的事情就是,判斷裝飾器接收的參數,如果只有一個并且第一個參數是可調用的(callable),那么這就是一個無參數的裝飾器(不需要加括號)。如果還有別的參數,就返回一個生成裝飾器的函數(decorator_maker)。

裝飾器是一個函數。裝飾器被裝飾過之后,這個裝飾器運行之前就會先運行裝飾器的裝飾器的代碼,也就是我們的doublewrapp。然后返回值可能是一個裝飾器,也可能是一個裝飾器的maker(有參數的裝飾器),然后裝飾器再執行,裝飾原函數。

這里有點繞,因為本來裝飾器里面一般就會有三四層函數了,(maker, decorator, wrapper, realfunc),再加上一個裝飾器的裝飾器,會有點理解困難。如果理解不了,最好不要對著網上的博文(包括本文)企圖格物致知了,多去看看代碼,多寫一寫。

2017年12月31日更新:《Python3 Cookbook》中提供了另一種實現方法,代碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

fromfunctoolsimportwraps,partial

importlogging

deflogged(func=None,*,level=logging.DEBUG,name=None,message=None):

iffuncisNone:

returnpartial(logged,level=level,name=name,message=message)

logname=nameifnameelsefunc.__module__

log=logging.getLogger(logname)

logmsg=messageifmessageelsefunc.__name__

@wraps(func)

defwrapper(*args,**kwargs):

log.log(level,logmsg)

returnfunc(*args,**kwargs)

returnwrapper

# Example use

@logged

defadd(x,y):

returnx+y

@logged(level=logging.CRITICAL,name='example')

defspam():

print('Spam!')

這種原理也比較好理解,看例子1,我們知道這等價于logged(add),第一個參數是函數,所以直接返回。看例子2,等價于logged(level=logging.CRITICAL, name='example')(spam),logged的第一個參數func是None(如果是裝飾器語法,第一個參數會默認傳入函數,而這里直接是函數調用,并非裝飾器。所以會返回一個partial函數,這個partial函數是真正的裝飾器,然后再走后面裝飾器的路子。其實,這種方法也是利用了“判斷傳入裝飾器的參數”。

參考資料

總結

以上是生活随笔為你收集整理的python if后面要不要加括号_Python装饰器兼容加括号与不加括号的写法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 东方av在线播放 | 国产精品久久久久9999 | 国产做爰视频免费播放 | 特种兵之深入敌后 | 日韩不卡视频在线观看 | 理论片久久| 天天干夜夜爱 | 成人免费视频国产在线观看 | 伦理欧美 | 五十路av在线 | 深爱五月综合网 | 亚洲熟妇丰满大屁股熟妇 | 欧美在线资源 | 欧美乱仑 | 日韩 欧美 亚洲 国产 | 一级黄色片网址 | 理论片在线观看理伦片 | 国产嫩草影视 | 69视频免费看 | 亚州国产精品 | 在线免费看污视频 | 国产欧美日韩 | 在哪里可以看毛片 | 奇米888一区二区三区 | 性插视频在线观看 | 色综合激情 | 成人在线高清视频 | 久久疯狂做爰流白浆xx | av福利在线免费观看 | 久久精品国产电影 | 精品国产乱码久久久久久久 | 成人ay | 中文字幕人妻一区 | 无码人妻一区二区三区在线视频 | 国产精品色图 | 国产福利二区 | 久久你懂的 | 国产ts变态重口人妖hd | 91大神网址| 国产高清在线免费观看 | 黑人玩弄人妻一区二区三区影院 | 日本va视频| 国产成人激情视频 | 涩里番在线观看 | 日韩卡一卡二 | 天堂二区| 久久草精品| 国产亚洲精品久久久久四川人 | 婷婷的五月天 | 国产精品无人区 | 性色一区 | 成人网免费看 | 免费中文字幕 | 中文字幕a级片 | 亚洲人成影视 | 色婷婷97| 男人天堂2020| 国产一区二区三区麻豆 | 天天看夜夜爽 | 亚洲 欧美 另类 综合 偷拍 | 天天干天天干天天干 | 欧美一级特黄aaaaaa大片在线观看 | 另类小说婷婷 | 中文字幕无码人妻少妇免费 | 日韩欧美综合久久 | 色综合天天综合网天天看片 | 中文字幕h | 国产精品国产三级国产传播 | 日韩一区视频在线 | 秋霞在线一区二区 | 国产天堂久久 | 国产视频一区二区 | 操一操av| www污污| 国产专区av | 2019中文在线观看 | a在线视频 | 亚洲精品男人天堂 | 日批黄色| 青少年xxxxx性开放hg | 欧美一级做性受免费大片免费 | 一级片一级片 | 蜜桃av噜噜一区二区三区麻豆 | 日韩欧美激情在线 | 免费的性爱视频 | 欧美精品一二区 | 狂野欧美性猛交免费视频 | 亚洲蜜桃av | 大乳女喂男人吃奶视频 | 色哟哟无码精品一区二区三区 | 岛国精品资源网站 | 色婷婷久久久亚洲一区二区三区 | 国语对白少妇spa私密按摩 | av有码在线 | 欧美日韩一区二区三 | 极品美女一区二区三区 | 亚洲毛片大全 | 色婷婷在线影院 | 欧美一级特黄aa大片 |