Category Archives

28 Articles

Python局部變量的坑

0   10240 轉為簡體

最近碰到這麼個問題,有這麼個函數,用來將HTML轉義字符變回原來的字符:

其中unichr用來將一個整數轉換成Unicode字符,僅在Python2中存在。Python3中,chr可以同時處理ASCII字符和Unicode字符。所以我們在Python3環境中將unichr映射到chr上。

運行這段代碼會在第8行報錯:NameError: free variable ‘unichr’ referenced before assignment in enclosing scope。而且只有Python2會報錯,Python3不會。

 

首先從問題上看,報錯的原因是在閉包replc里unichr沒有定義。

但是Python2明明是有unichr這個內置函數的,為啥就變成未定義呢?

Read More

cloudflare-partner-cli: using CNAME on cloudflare

中文版本

This is a CLI program that let you set CNAME to use Cloudflare using the partner program.

Both Python2.x and Python3.x is supported. No extra library is needed.

To use Chinese menu, set environment variable LANG to use UTF-8 (for example, zh_CN.UTF-8).

Usage

  1. Apply for partner program at https://www.cloudflare.com/partners/.
  2. Clone this repository or download script.
  3. Run python ./cloudflare-partner-cli.py.
  4. Enter your host_key. You can get it here.
  5. Enter the account you use to manage domains (your personal account, not partner login account). User key is stored in .cfhost.
  6. Follow the instructions on screen.

Note

  • Value of resolve_to has to be DNS record (for example: google.com) instead of IP address.

cloudflare-partner-cli: 使用CNAME方式接入Cloudflare

0   11368 轉為簡體

English Version

使用Cloudflare partner功能用CNAME方式接入cloudflare。

你可以使用Python2.x或者Python3.x。無需安裝任何依賴。

如需使用中文菜單,請將環境變量的LANG設置為使用UTF-8 (比如zh_CN.UTF-8)。

使用方法

  1. 申請Cloudflare partner計劃 https://www.cloudflare.com/partners/ 。
  2. clone本項目或者直接下載腳本
  3. 運行 python ./cloudflare-partner-cli.py
  4. 輸入 host_key。可以從這裡獲得。
  5. 輸入要用來管理域名的賬號 (你的個人賬號,不是partner賬號)。賬戶信息保存在.cfhost文件中。
  6. 按照屏幕提示操作。

注意

  • 源站地址必須為DNS記錄,如google.com,不能填寫IP地址。

 

Python float和decimal

2   10255 轉為簡體

在Windows上打包Python腳本時遇到一個需求,將浮點數轉成字符數組,比如輸入1.001,得到[‘1′,’0′,’0′,’1’]

一開始想當然地用了:

version = 2.001

v = list(str(int(version * 1000)))

發現好像哪裡不對,得到的v是[‘1’, ‘0’, ‘0’, ‘0’]。想了一想應該是浮點數的精度問題,因為一看version * 1000 = 1000.9999999999999

所以有這麼幾種解決方法:

v = list(str(int(round(version * 1000))))

或者:

v = list(str(version).replace(“,”, “”) + “000”)[:4]

或者用decimal模塊,decimal是固定小數點位數的,用的是十進制乘除法,所以(在設定的位數內)不會產生誤差:

from decimal import getcontext, Decimal

getcontext().prec = 4

v = list(str(Decimal(version) * 1000))

需要注意的是decimal會自動轉換科學計數法,可以用”%d” % Decimal(d)來得到原始值。

 

Python中熱補丁(Hot Patching)的實現和一些問題

2   16161 轉為簡體

有時候我們可能需要只修改一部分代碼而且要求修改立即生效,或者為了高可用性不允許停止服務程序,這時我們就需要熱補丁

在debian,red hat等系統(或者vista之後的windows)的軟件更新時,通常使用替換符號鏈接來達到高可用性。

對Python來說,解釋器預先處理了腳本生成字節碼,並讀入內存;所以之後硬盤上的文件發生了什麼變化,就只能想辦法命令解釋器重新讀入新的腳本。實現這個功能的內建命令是reload

Read More