• <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 (轉)

            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'  


              轉自http://blog.csdn.net/wanghai__/article/details/7078792

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

            久久香综合精品久久伊人| 成人精品一区二区久久| 国产精品狼人久久久久影院| 国产Av激情久久无码天堂| 伊人久久大香线焦AV综合影院 | 亚洲国产精品一区二区久久hs| 久久激情亚洲精品无码?V| 99久久国产亚洲高清观看2024| 国产精品毛片久久久久久久| 99精品国产在热久久| 久久成人精品视频| 91精品国产高清久久久久久91 | 国产叼嘿久久精品久久| 99久久婷婷国产一区二区| 99久久99久久| 大香网伊人久久综合网2020| 国产高清国内精品福利99久久| 久久播电影网| 国内精品九九久久精品| 亚洲精品乱码久久久久久蜜桃不卡| 色综合久久夜色精品国产| 亚洲va国产va天堂va久久| 久久天天躁狠狠躁夜夜网站| 免费观看成人久久网免费观看| 久久97久久97精品免视看| 久久婷婷是五月综合色狠狠| 久久夜色精品国产噜噜亚洲AV| 91精品国产91久久综合| 热RE99久久精品国产66热| 亚洲人成精品久久久久| 久久精品国内一区二区三区 | 久久精品无码一区二区WWW| 久久香蕉超碰97国产精品| 99久久精品久久久久久清纯| 中文字幕无码久久久| 国产午夜精品理论片久久影视 | 亚洲午夜久久久| 国产一级持黄大片99久久| 国产精品99久久久精品无码| 久久线看观看精品香蕉国产| 久久久亚洲裙底偷窥综合 |