使用'%'运算符的字符串格式的可选键?

时间:2016-08-29 09:38:14

标签: python python-2.7 string-formatting

使用'%'运算符可以在string formats中使用可选键吗? 我在Python 2.7中使用日志记录 API,因此我无法使用Advanced String Formatting

我的问题如下:

>>> import logging

>>> FORMAT = '%(asctime)-15s %(message)s %(user)s'
>>> logging.basicConfig(format=FORMAT)

>>> logging.warning("It works for:", extra={'user': 'me'})
2016-08-29 11:24:31,262 It works for: me

>>> logging.warning("It does't work!")
Traceback (most recent call last):
  ...
KeyError: 'user'
Logged from file <input>, line 1

如果遗失,我想为用户设置一个空字符串。我怎么能这样做?

我尝试使用defaultdict,但失败了:

>>> import collections
>>> extra = collections.defaultdict(unicode)
>>> logging.warning("It does't work!", extra=extra)
Traceback (most recent call last):
  ...
KeyError: 'user'
Logged from file <input>, line 1

相比之下,使用Jinja2,我们可以做到:

>>> import jinja2
>>> jinja2.Template('name: {{ name }}, email: {{ email }}').render(name="me")
u'name: me, email: '

=&GT;这里没有例外,只是一个空字符串(用于“电子邮件”)。

1 个答案:

答案 0 :(得分:1)

A)1.1.1.1方法可以正常工作,但只有直接使用才能正常使用。

defaultdict

B)使用日志函数的>>> import collections >>> dd=collections.defaultdict(str) >>> dd['k'] = 22 >>> '%(k)s %(nn)s' % dd '22 ' 参数,如文档中所述,即不直接如上所示。这就是为什么使用extra代替常规defaultdict并没有什么区别。

  

第三个关键字参数是extra,可用于传递a   用于填充LogRecord的 dict 的字典   使用用户定义的属性为日志记录事件创建。

C)您可以使用日志记录过滤器来处理缺少的额外数据:

dict

任何使用import logging class UserFilter: def filter(self, record): try: record.user except AttributeError: record.user = '<N/A>' return True FORMAT = '%(asctime)-15s %(message)s %(user)s' logging.basicConfig(format=FORMAT) logging.getLogger().addFilter(UserFilter()) logging.warning("It works for:", extra={'user': 'me'}) logging.warning("It doesn't work!") # DATE TIME It doesn't work! <N/A> 方法的课程都可以。它可以就地修改记录,并且必须返回filter以接受记录,或True将其过滤掉。