<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 問題 你寫了一個裝飾器作用在某個函數上,但是這個函數的重要的元信息比如名字、文檔字符串、注解和參數簽名都丟失了。 ## 解決方案 任何時候你定義裝飾器的時候,都應該使用 `functools` 庫中的 `@wraps` 裝飾器來注解底層包裝函數。例如: import time from functools import wraps def timethis(func): ''' Decorator that reports the execution time. ''' @wraps(func) def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(func.__name__, end-start) return result return wrapper 下面我們使用這個被包裝后的函數并檢查它的元信息: >>> @timethis ... def countdown(n:int): ... ''' ... Counts down ... ''' ... while n > 0: ... n -= 1 ... >>> countdown(100000) countdown 0.008917808532714844 >>> countdown.__name__ 'countdown' >>> countdown.__doc__ '\n\tCounts down\n\t' >>> countdown.__annotations__ {'n': <class 'int'>} >>> ## 討論 在編寫裝飾器的時候復制元信息是一個非常重要的部分。如果你忘記了使用 `@wrap` ,那么你會發現被裝飾函數丟失了所有有用的信息。比如如果忽略 `@wrap` 后的效果是下面這樣的: >>> countdown.__name__ 'wrapper' >>> countdown.__doc__ >>> countdown.__annotations__ {} >>> `@wraps` 有一個重要特征是它能讓你通過屬性 `__wrapped__` 直接訪問被包裝函數。例如: >>> countdown.__wrapped__(100000) >>> `__wrapped__` 屬性還能讓被裝飾函數正確暴露底層的參數簽名信息。例如: >>> from inspect import signature >>> print(signature(countdown)) (n:int) >>> 一個很普遍的問題是怎樣讓裝飾器去直接復制原始函數的參數簽名信息,如果想自己手動實現的話需要做大量的工作,最好就簡單的使用 `__wrapped__` 裝飾器。通過底層的 `__wrapped__` 屬性訪問到函數簽名信息。更多關于簽名的內容可以參考9.16小節。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看