2012-06-14 59 views
1

一般來說,我非常重視模塊隱私(如果一個變量帶有下劃線前綴,我不會使用它)。然而,我有一個角落案例,它似乎是合理的「安全」。尊重argparse的隱私與可用性

這裏的演示(my previous question

parser=argparse.ArgumentParser() 
parser.add_argument('--point',help='enter a point (e.g. 2,3,4)') 
parser.parse_args('--point=-2,5,6'.split()) #works 
parser.parse_args('--point -2,5,6'.split()) #doesn't work 

這可以通過固定的:在這種情況下

parser=argparse.ArgumentParser() 
parser.add_argument('--point',help='enter a point (e.g. 2,3,4)') 
parser.parse_args('--point=-2,5,6'.split()) #works 
parser._negative_number_matcher = re.compile(r'^-\d+|^-\d*\.\d+') 
#Next line works too on Cpython 2.6, 
#got the idea from reading Cpython 3.2 source so it should work there too 
parser.parse_args('--point -2,5,6'.split()) 

的一個類的內部玩這個量看起來不錯,因爲:

*如果argparse更改該變量(不太可能)或不同的python實現做不同的事情,看起來這不太可能會改變導致某些事情中斷的類。

*其他python實現可能使用cpython的argparse,因爲它是用純python編寫的(據我所知)。

*我的代碼並不依賴於這個「功能」的工作。 (用戶可以始終恢復傳遞' - point = -2,5,6')

我的問題是這樣的:我是否錯過了什麼?這真的是一個壞主意嗎?我可能會打破什麼?如果是這樣,爲什麼?

+2

恕我直言,這就是猴子補丁的全部內容,也是Python無法解決的原因。 – sberry

回答

3

我認爲這是一個糟糕的主意,並不是因爲它可能會破壞argparse內部的某些東西,而是因爲它錯了。 ^-\d+對於負數不是有效的正則表達式(因爲它匹配-23foo),並且在代碼中顯示錯誤的東西不利於維護。想象一下你自己(或者更糟的是別人)在兩年後盯着這段代碼,並且對於^-\d+應該如何匹配負數感到困惑!

+0

如果有評論說那爲什麼換成正則表達式會怎麼樣? – mgilson

+0

@mgilson:評論可以讓事情看起來更好,但我個人總是儘量避免在我的代碼中使用'dog = cat'等荒謬的東西。 – georg