2017-02-25 75 views
1

我在運行Python 3.5.2的機器上創建了Python腳本。現在我想在運行Python 3.4.2的另一臺計算機上運行它,並且我沒有可能在那裏升級Python。 我的問題是,我用Python 3如何解決方法urllib.parse.urlencode Python 3.4.2中缺少quote_via

urllib.parse.urlencode(dict, safe='/', quote_via=urllib.parse.quote) 

的quote_via選項顯然不是在Python 3.4.2可用,所以我得到一個錯誤

TypeError: urlencode() got an unexpected keyword argument 'quote_via' 

我需要來urlencode字典dict這裏,使用quote()只有不是quote_plus(),這是3.4和3.5的默認值。但是,只有3.5似乎有可能覆蓋默認值。

我該如何解決這個問題?

回答

2

實現您自己的urlencode()函數。 urllib.parse.urlencode() library function主要包含測試以確保可以處理bytesstr對象以及處理doseq標誌。否則,它只是一個循環,它對每一對的密鑰和值都進行編碼,在它們之間加入=,並將所有這些對與&連接起來。爲您的輸入實現相同的循環,並對您需要的變體進行硬編碼。

您可以複製您的特定行爲:

'&'.join(['{}={}'.format(quote(k, safe='/'), quote(v, safe='/')) 
      for k, v in dict.items()]) 
+0

太謝謝你了!這完美的作品! – absurd

1

骯髒的黑客的做法:)

import urllib.parse 
import sys 
major, minor, _, _, _ = sys.version_info 
if major == 3 and minor < 5: 
    urllib.parse.quote_plus = urllib.parse.quote 

UPD:略少髒:

class MonkeyPatchQuote(object): 
    def __init__(self): 
     major, minor, _, _, _ = sys.version_info 
     self.should_patch = major == 3 and minor < 5 

    def __enter__(self): 
     if self.should_patch: 
      self.original_handler = urllib.parse.quote_plus 
      urllib.parse.quote_plus = urllib.parse.quote 

    def __exit__(self, *args): 
     if self.should_patch: 
      urllib.parse.quote_plus = self.original_handler 
+0

:-)好的。但是我不確定,如果我在其他地方使用'quote_plus'。所以,這可能是有風險的。不過謝謝你。 – absurd

+0

這將是一個全球變化,*和*你沒有保存對舊版本的引用來恢復。 –

+0

上下文管理器拯救:) – mshrbkv