• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Just enjoy programming

            python functools wraps (轉(zhuǎn))

            When you use a decorator, you're replacing one function with another. In other words, if you have a decorator

            1. def logged(func):  
            2.     def with_logging(*args, **kwargs):  
            3.         print func.__name__ + " was called"  
            4.         return func(*args, **kwargs)  
            5.     return with_logging  

            then when you say

            1. @logged  
            2. def f(x):  
            3.    """does some math"""  
            4.    return x + x * x  

            it's exactly the same as saying

            1. def f(x):  
            2.     """does some math"""  
            3.     return x + x * x  
            4. f = logged(f)  

            and your function f is replaced with the function with_logging. Unfortunately, this means that if you then say

            1. print f.__name__  

            it will print with_logging because that's the name of your new function. In fact, if you look at the docstring for f, it will be blank because with_logging has no docstring, and so the docstring you wrote won't be there anymore. Also, if you look at the pydoc result for that function, it won't be listed as taking one argument x; instead it'll be listed as taking *args and **kwargs because that's what with_logging takes.

            If using a decorator always meant losing this information about a function, it would be a serious problem. That's why we have functools.wraps. This takes a function used in a decorator and adds the functionality of copying over the function name, docstring, arguments list, etc. And since wraps is itself a decorator, the following code does the correct thing:

            1. from functools import wraps  
            2. def logged(func):  
            3.     @wraps(func)  
            4.     def with_logging(*args, **kwargs):  
            5.         print func.__name__ + " was called"  
            6.         return func(*args, **kwargs)  
            7.     return with_logging  
            8.  
            9. @logged  
            10. def f(x):  
            11.    """does some math"""  
            12.    return x + x * x  
            13.   
            14. print f.__name__  # prints 'f'  
            15. print f.__doc__   # prints 'does some math'  


              轉(zhuǎn)自http://blog.csdn.net/wanghai__/article/details/7078792

            posted on 2013-11-05 20:40 周強(qiáng) 閱讀(374) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久婷婷五月综合色奶水99啪| 久久影院综合精品| 国产精品一区二区久久国产| 久久只有这里有精品4| 久久久久香蕉视频| 久久综合九色综合久99| 日本久久久久久久久久| 色播久久人人爽人人爽人人片aV| 88久久精品无码一区二区毛片 | 蜜桃麻豆www久久| 久久精品国产亚洲AV无码偷窥| 久久ww精品w免费人成| 国产精品久久影院| 久久久久亚洲精品天堂久久久久久 | 国产韩国精品一区二区三区久久| 香蕉久久一区二区不卡无毒影院| 国产精品久久久久无码av| 国产精品久久午夜夜伦鲁鲁| 伊人久久大香线蕉综合Av| 少妇内射兰兰久久| 国产精品视频久久| 国产精品热久久无码av| 国产69精品久久久久99| 国产精品狼人久久久久影院| 一本色道久久综合狠狠躁篇| 亚洲国产另类久久久精品小说| 99久久免费国产特黄| 久久亚洲高清综合| 国产精品久久永久免费| 性做久久久久久久久老女人| 亚洲va久久久噜噜噜久久| 国内精品久久久久久麻豆| 99久久免费国产精品特黄| 精品999久久久久久中文字幕| 狠狠人妻久久久久久综合蜜桃| 久久久www免费人成精品| 伊人色综合久久天天| 亚洲中文字幕无码久久精品1| 久久亚洲精品中文字幕三区| 久久九九兔免费精品6| 亚洲乱亚洲乱淫久久|