2017-02-17 21 views
0

我經常看到以下模式,並想知道是否有避免重複的方法。字符串格式。從本地環境獲取關鍵字參數

life = 42 
badger = some_function() 
s = "({life}, {badger})".format(life=life,badger=badger) 

局部變量通常具有與它們在字符串中的含義相對應的連貫名稱。我目前使用的更簡潔:

s = "({0}, {1})".format(life,badger) 

該模板通常使用關鍵字更清晰。是否有一種通用/簡潔的方式來獲取格式以在包含函數的詞彙環境中查找關鍵字?

s = "({life}, {badger})".format(env()) 

謝謝!

回答

1

您可以使用locals()

s = "({life}, {badger})".format(**locals()) 
+0

'** locals()'是非常好的,thank you。在兩分鐘內四個很好的答案是相當了不起的 –

+0

請記住'locals()'只提供一個本地範圍內的變量字典 - 如果你想從函數中調用它,那麼外部變量都不會實際上你需要創建一個結合了'globals()'和'locals()'的新字典來獲得'全範圍':'.format(** dict(globals(),** locals()) )'這時它開始變得笨重,內存效率低下,並且潛在的問題纏身了。我建議你擴展'string.Formatter'並實現你自己的範圍處理和按需請求值調用。 – zwer

2

Python 3.6已經用literal string interpolation解決了這個問題; f-strings:

>>> life = '2' 
>>> badger = 'more' 
>>> f'{life} {badger}' 
'2 more' 

如果升級不會花費那麼多,那麼你可以看看這個方向。

+0

這很有趣。 F字符串正是我所希望的。 3.6是一個延伸,但是2.7是一個更容易賣出:( –

1

摩西的答案是真棒爲Python 3

如果你需要的東西的Python 2,你可以試試這個:

不知怎的,拿出一個字典

In [6]: env = dict(life=42, badger='badger') 

In [7]: env 
Out[7]: {'badger': 'badger', 'life': 42} 

In [11]: "({life}, {badger})".format(**env) 
Out[11]: '(42, badger)' 

In [12]: "({0}, {1})".format(*env) 
Out[12]: '(life, badger)' 

In [13]: 

例如使用os.environ

In [13]: import os 

In [14]: "({0}, {1})".format(*os.environ) 
Out[14]: '(VIEWCLIENT_WINDOWS_TIMEZONE, VIEWCLIENT_BROKER_DOMAINNAME)' 

In [15]: 

免責聲明:我在咖啡之前及早閱讀了這篇文章。技術工作。其他人是正確的,你可以用當地人os.environ的地方。

我更側重於使用*的

+0

這是非常有趣的,我會看看本地綁定是否在運行時可用 - 我很樂觀,他們將是 –

1

如果您無法使用F-串,存在使用locals()**kwargs參數傳遞形式共同的選擇:

>>> a = 3 
>>> b = 5 
>>> '{a} {b}'.format(**locals()) 
'3 5' 
相關問題