1.《python核心编程》的这段程序怎么理解?对于这个函数,书上说两个wraaped是闭包,但是不知道谁是自由变量。
2.代码:
from time import time
def logged(when):
def log(f, *args, **kwargs):
print '''Called:
function: %s
args: %r
kwargs %r''' % (f, args, kwargs)
def pre_logged(f):
def wraper(*args, **kwargs):
log(f, *args, **kwargs)
return f(*args, **kwargs)
return wraper
def post_logged(f):
def wrapped(*args, **kwargs):
now = time()
try:
return f(*args, **kwargs)
finally:
log(f, *args, **kwargs)
print "time delta: %s" % (time()-now)
return wrapped
try:
return {"pre": pre_logged, "post": post_logged}[when]
except KeyError, e:
raise ValueError(e), 'must bre "pre" or "post"'
@logged("post")
def hello(name):
print "Hello, ", name
hello('World!')
Penutupan yang dipanggil merujuk kepada fungsi yang ditakrifkan dalam fungsi. Sebenarnya, secara tegasnya, semua definisi fungsi di bawah fungsi anda yang dilog di atas adalah penutup
Mengenai penutupan:
Apabila fungsi sebaris merujuk kepada pembolehubah dalam skop luar, kami mendapat penutupan. Untuk membuat penutupan, perkara berikut mesti dipenuhi pada masa yang sama:
1 Mesti ada fungsi sebaris. Fungsi luaran dalam soalan adalah pra_log dan post_log, dan fungsi terbenam yang sepadan adalah pembungkus dan dibalut.
2. Fungsi sebaris mesti merujuk pembolehubah fungsi luaran. Soalan itu merujuk kepada args luaran, *parameter kwargs.
3. Nilai pulangan bagi fungsi luaran mestilah fungsi terbenam. Dalam soalan, pembalut pulangan, pembalut pulangan digunakan untuk kembali.
Mengenai penghias:
Ringkasnya, penghias ialah fungsi yang mengubah suai fungsi fungsi lain. Soalan yang dilog masuk ialah penghias, yang digunakan untuk menghiasi fungsi helo yang anda tentukan.
Anda lulus dalam "post" sebagai parameter penghias Menurut: return {"pre": pre_logged, "post": post_logged}[apabila]
Fungsi post_logged dipanggil masa yang dihabiskan ( masa()-sekarang)
Untuk penjelasan terperinci tentang penghias, sila rujuk "Python Advanced":
Penjelasan terperinci penghias
Seluruh buku ini diterjemahkan dengan baik dan saya syorkan membacanya.