2012-02-25 50 views
3

我覺得這是一個難以置於單詞中的問題,因此是例子。然而,我基本上被給予arbitrary format strings,我需要(有效地)從數據庫中獲取適當的值,以便動態地構建相關的映射對象。如何從Python(傳統)格式字符串中提取字段名稱?

給定的格式字符串期待一個映射對象,例如:

>>> 'Hello, %(first-name)s!' % {'first-name': 'Dolph'} 
'Hello, Dolph!' 

我正在尋找的實現 'infer_field_names()' 下面:

>>> infer_field_names('Hello, %(first-name)s! You are #%(customer-number)d.') 
['first-name', 'customer-number'] 

我知道我可以寫正則表達式(甚至試圖解析異常消息!),但我希望有一個現有的API調用,我可以使用,而不是..?

基礎上string Formatter docs,我想這會工作:

>>> import string 
>>> format_string = 'Hello, %(first-name)s! You are #%(customer-number)d.' 
>>> [x[1] for x in string.Formatter().parse(format_string)] 
[None] 

但是,這並沒有完全回到我所期待的(的field_name S,A每個列表的文檔)。

+1

請注意,您的方法可行,但只針對'{}'樣式的格式:''你好,{第一name}等!你是#{customer-number} d.'' – beerbajay 2012-02-25 20:30:23

+0

@beerbajay:測試過^,你說得對...我想現在改變風格還不算太遲。爲什麼它適用於一種風格而不適用於另一種風格?有關於此的任何文檔? – Dolph 2012-02-25 20:34:53

+0

由於'string.Formatter'稍後實施(在[PEP-3101](http://www.python.org/dev/peps/pep-3101/)之後)。 – beerbajay 2012-02-25 20:41:03

回答

6

當使用%運算符來格式化字符串時,右操作數不一定是字典 - 它只需要一些對象將必需的字段名映射到應該被置換的值。所以你所要做的就是編寫一個重新定義的類__getitem__(),它從數據庫中檢索這些值。

這裏是一個毫無意義的例子:

class Mapper(object): 
    def __getitem__(self, item): 
     return item 

print 'Hello, %(first-name)s!' % Mapper() 

打印

Hello, first-name! 
+0

我需要在單個查詢中檢索所有值,但這非常酷,而且我可以使用它:) – Dolph 2012-02-25 20:37:21

+0

您可以使用這種方式獲取所有值,只需編寫您的'Mapper',以便保存每個'項目'到內部緩存並在運行格式化操作後讀出所有值。例如而不是'return item',在內部'items'列表上執行'self.items.append(item)'。 – beerbajay 2012-02-25 20:42:33

+0

@Dolph:你當然可以使用它來收集所需項目的名稱,構建字典並在第二個%操作中執行實際的格式化。 (可能這就是你所說的「我可以使用它」的意思。) – 2012-02-25 20:43:25

相關問題