【问题标题】:Check if value was provided from within format string检查是否从格式字符串中提供了值
【发布时间】:2020-04-24 09:03:34
【问题描述】:

我有一个格式字符串fmt,在我无法控制的另一个模块中将调用format 方法。

在这个格式字符串中,如果它作为参数提供给格式方法,我想选择性地包含一个字段,否则我想省略它。

类似:

fmt = 'Optional value: {value if wasPassed("value") else ""}'
fmt.format(value = "foo") #Should return 'Optional value: foo'
fmt.format() #Should return 'Optional value: ' and not throw a Key error

由于我无法访问“格式”调用,我想以某种方式在字符串中解决这个问题。 对于上下文,我将其用作传递给日志记录模块的格式字符串,但我真的很想为上述问题提供一个通用解决方案。

在特定的用例中,我可以将自定义格式化程序传递给记录器,但这个问题的真正目的是在要格式化的字符串中的表达式中解决这个问题。 (如果那是不可能的,我也很感激能说明原因的答案,这样我就可以停止吠叫错误的树,而只需使用自定义格式化程序)

【问题讨论】:

  • 这能回答你的问题吗? Leaving values blank if not passed in str.format
  • 由于我无法访问客户端代码,因此我无法真正将 format 更改为 format_map。在我的具体情况下,我可以通过为记录器指定自定义格式化程序来解决它,但它不能回答是否/如何仅在格式化字符串中的表达式内解决这个问题。

标签: python string logging formatting string-interpolation


【解决方案1】:

假设您可以控制模块何时使用参数,您可以编写一个“包装”函数,例如

def myformat(fmt, arg=""):
    module.method(fmt, arg)

或者像这里的递归方法(基于捕获和处理 KeyError)可能是所有可能的(基于docs),因为您无权访问方法内部: https://stackoverflow.com/a/56895928/7224691

虽然我会小心使用这种方法,特别是因为它不适用于更复杂的模块方法,这可能会导致下一次迭代的副作用(或者只是简单地打印字符串两次而不是一次)。

以上内容旨在作为一般性答案,而对于此问题的日志记录方面的具体答案,我们可能(假设没有其他可能的方法)需要知道您正在使用什么模块。

【讨论】:

  • 反对者能否评论哪些可以/需要改进?
猜你喜欢
  • 1970-01-01
  • 2015-12-28
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 2016-06-07
  • 2011-10-06
  • 1970-01-01
相关资源
最近更新 更多