2017-02-17 22 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' 
相关问题