《python核心编程》中高级闭包和装饰器理解?
高洛峰
高洛峰 2017-04-18 10:34:08
0
2
697

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!')
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(2)
Peter_Zhu

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.

@logged("post")
def hello(name):
    print "Hello, ", name

hello('World!')

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan