2011-02-13 11 views
1

我有「STR」對象的子類,我需要將其應用到應用程序域。由於應用程序充滿了字符串文字和str()強制轉換,因此需要很長時間才能將它們全部更改爲自定義字符串類。我知道可以重寫'str()',但我不確定字符串文字。強制str()和兩個字符串文字來創建一個自定義字符串?

我知道這是不是一個好主意,但應用程序需要它。是否有可能在Python中完成?如果不是,它要求我修改「stringlib」,這是C實現「STR」對象?

我也知道一個事實,即修改解析器使應用程序運行被認爲是一個非常不好的編程習慣。這可以通過擴展而不是解析器修改來實現嗎?

+0

當然不是沒有黑客的實施,這當然不是你想要的。 (不應該`grep`或任何其他搜索工具顯示所有字符串文字和`str`調用?) – delnan 2011-02-13 12:51:03

回答

1

您不能修改內置類型,例如你不能在運行時添加新屬性:

>>> setattr(str, "hello", lambda: "Hello custom str!") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: can't set attributes of built-in/extension type 'str' 

我會嘗試解析所有文字字符串,並與您的自定義字符串子類的構造函數替換它們。這首先是:

  • 明確,這使得它更容易爲你和其他要記住,這個字符串是不同的。

典型情況下,i18n庫有一些用於代碼的字符串文字檢測例程,它可以在檢測期間派上用場。一旦收集到這些字符串,或多或少只是替換


這也是一個原因,蟒並不如紅寶石靈活。你不能只編寫測試庫,它會修補核心類,併爲運行時的每個對象添加如should_equal這樣的方法。這是一個有趣的高科技不談這些細微差別和其consequencies:http://blog.extracheese.org/2010/02/python-vs-ruby-a-battle-to-the-death.html

1

我就遇到了這個問題,因爲我試圖做同樣的事情 - 從蟒蛇> = 2.7蟒蛇> = 2.4工作str.format行爲。來自stringformat的FormattableString(https://github.com/florentx/stringformat)似乎是正確的,但它只有在我可以使它在文字上工作時纔有用。

儘管大多數意見,猴子修補內建和文字在python確實出現使用代碼我發現這裏是可能的:https://gist.github.com/295200。這似乎是Armin Ronacher寫的 - 當然不是我自己寫的。

最後,我能夠做這樣的事在Python 2.6,即使它通常只在2.7工作。

dx = get_class_dict(str) 
dx['format'] = lambda x,*args,**kargs: FormattableString(x).format(*args,**kargs) 
print "We've monkey patched {}, {}".format('str', 'with multiple parameters') 

以上鍊接中的示例顯示瞭如何添加新方法而不是替換現有方法。

這個小練習促使我到STR和unicode猴子補丁添加到的StringFormat封裝,所以現在你可以這樣做:

# should work on python down to 2.4 
import stringformat 
print "[{0:{width}.{precision}s}]".format('hello world', width=8, precision=5) 

這可以從這裏克隆:「https://開頭的github .com/igg/stringformat「,直到/除非它被拉入」官方「字符串格式。哈。只有兩個超鏈接對我來說,所以沒有點擊你!

相關問題