• <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   管理


            久久精品国产久精国产| 欧美色综合久久久久久| 香蕉久久av一区二区三区| 区久久AAA片69亚洲| 日韩人妻无码一区二区三区久久| 精品久久久久久亚洲精品| 97精品久久天干天天天按摩| 日本久久久久久中文字幕| 天天综合久久一二三区| 国产人久久人人人人爽| 久久久精品久久久久久| 久久久无码一区二区三区| 国产精品99久久久久久董美香 | 粉嫩小泬无遮挡久久久久久| 国产精品免费久久久久电影网| 伊人久久综合无码成人网| 国内精品久久久久影院免费 | 伊人久久综合精品无码AV专区| 久久A级毛片免费观看| 看全色黄大色大片免费久久久| 久久国产精品一国产精品金尊 | 日韩电影久久久被窝网| 99久久精品国产免看国产一区| 超级97碰碰碰碰久久久久最新| 国产ww久久久久久久久久| 国产精品禁18久久久夂久| 久久久久亚洲精品日久生情| 久久精品一区二区三区中文字幕| 久久精品九九亚洲精品| 日韩精品久久无码人妻中文字幕 | 久久精品国产亚洲AV电影| 午夜精品久久影院蜜桃| 久久国产热这里只有精品| 亚洲综合精品香蕉久久网97| www.久久热.com| 99久久无色码中文字幕 | 99久久国产综合精品网成人影院| 久久国产精品无码一区二区三区| 久久精品人成免费| 91精品国产高清久久久久久io | 国产免费久久久久久无码|