iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 27
0

相較於return後再次呼叫該函式都是新的開始,yield類似一個紀錄點,local state會被保存

  • local variables
  • the instruction pointer
  • the internal evaluation stack
  • the state of any exception handling

保存後暫停,等到下一次執行時恢復上一次所保存的狀態
在iter_content定義了一個generator function,關於yield的使用分成兩個部分

  1. 判斷self.raw是否含有stream屬性後,使用存取該屬性為chunk並回傳
  2. 定義一個無窮迴圈,使用self.raw.read存取並回傳

等到所有內容被消化完成並且沒有發生錯誤,設定self._content_consumed為True

        def generate():
            # Special case for urllib3.
            if hasattr(self.raw, 'stream'):
                try:
                    for chunk in self.raw.stream(chunk_size, decode_content=True):
                        yield chunk

                except ProtocolError as e:
                    self._error = ChunkedEncodingError(e)

                except DecodeError as e:
                    self._error = ContentDecodingError(e)

                except ReadTimeoutError as e:
                    self._error = ConnectionError(e)

                finally:
                    # if we had an error - throw the saved error
                    if self._error:
                        raise self._error

            else:
                # Standard file-like object.
                while True:
                    chunk = self.raw.read(chunk_size)
                    if not chunk:
                        break
                    yield chunk

            self._content_consumed = True

參考


上一篇
Day26-python-yield-1
下一篇
Day28-text-binary-encoding
系列文
Why it works: python requests and urllib330
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言