<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 17.6.?`plural.py`, 第 5 階段 你已經精煉了所有重復代碼,也盡可能地把復數規則提煉到定義一個字符串列表。接下來的步驟是把這些字符串提出來放在另外的文件中,從而可以和使用它們的代碼分開來維護。 首先,讓我們建立一個包含你需要的所有規則的文本文件。沒有什么特別的結構,不過是以空格 (或者制表符) 把字符串列成三列。你把它命名為 `rules.en`,“en” 是英語的意思。這些是英語名詞復數的規則,你以后可以為其它語言添加規則文件。 ## 例?17.15.?`rules.en` ``` [sxz]$ $ es [^aeioudgkprt]h$ $ es [^aeiou]y$ y$ ies $ $ s ``` 現在來看看如何使用規則文件。 ## 例?17.16.?`plural5.py` ``` import re import string def buildRule((pattern, search, replace)): return lambda word: re.search(pattern, word) and re.sub(search, replace, word) def plural(noun, language='en'): lines = file('rules.%s' % language).readlines() patterns = map(string.split, lines) rules = map(buildRule, patterns) for rule in rules: result = rule(noun) if result: return result ``` | | | | --- | --- | | \[1\] | 在這里你還將使用閉合技術 (動態構建函數時使用函數外部定義的變量),但是現在你把原來分開的匹配函數和規則應用函數合二為一 (你將在下一節中明了其原因)。你很快會看到,這與分別調用兩個函數效果相同,只是調用的方法稍有不同。 | | \[2\] | 咱們的 `plural` 函數現在接受的第二個參數是默認值為 `en` 的可選參數 `language`。 | | \[3\] | 你使用 `language` 參數命名一個文件,打開這個文件并讀取其中的內容到一個列表。如果 `language` 是 `en`,那么你將打開 `rules.en` 文件,讀取全部內容,以其中的回車符作為分隔構建一個列表。文件的每一行將成為列表的一個元素。 | | \[4\] | 如你所見,文件的每一行都有三個值,但是它們是以空白字符 (制表符或者空格符,這沒什么區別) 分割。用 `string.split` 函數映射列表來創建一個每個元素都是三元素元組的新列表。因此,像 `[sxz]$ $ es` 這樣的一行將被打碎并放入 `('[sxz]$', '$', 'es')` 這樣的元組。這意味著 `patterns` 將最終變成元組列表的形式,就像[第 4 階段](stage4.html "17.5.?plural.py, 第 4 階段")實打實編寫的那樣。 | | \[5\] | 如果 `patterns` 是一個元組列表,那么 `rules` 就可以通過一個個調用 `buildRule` 動態地生成函數列表。調用 `buildRule(('[sxz]$', '$', 'es'))` 返回一個接受單參數 `word` 的函數。當返回的函數被調用,則將執行 `re.search('[sxz]$', word) and re.sub('$', 'es', word)`。 | | \[6\] | 因為你現在構建的是一個匹配和規則應用合一的函數,你需要分別調用它們。僅僅是調用函數,如果返回了內容,那么返回的便是復數;如果沒有返回 (也就是返回了`None`),那么該規則未能匹配,就應該嘗試其他規則。 | 這里的進步是你把復數規則完全分離到另外的文件中。不但這個文件可以獨立于代碼單獨維護,而且你建立了一個命名規劃使 `plural` 函數可以根據 `language` 參數使用不同的規則文件。 這里的缺陷是每次調用 `plural` 函數都需要去讀取一次文件。我想我可以在整本書中都不使用 “留給讀者去練習”,但是這里:為特定的語言規則文件建立一個緩存機制,并在調用期間規則文件改變時自動刷新_留給讀者作為練習_。祝你順利。
                  <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>

                              哎呀哎呀视频在线观看