【问题标题】:python 3: log function signature problempython 3:日志函数签名问题
【发布时间】:2011-06-21 02:00:40
【问题描述】:

我经常写如下代码:

print('object', 'moved', 'from =', object.location, 'dest =', new_location)
print('object', 'created', 'at =', object.location, 'status =', status)

等等。

我打算用函数log替换所有这些:

def log(self, action, **details):
  print('object', action, end = '')
    for var, value in state.items():
      print(var, '=', value, end = '')
    print()

几乎有效 - 除了两个问题。首先,我无法控制输出的顺序,这对我很重要。当然details只是一个字典,所以参数的顺序丢失了。其次,我不能使用任何语言关键字,例如,from 作为关键字参数的名称。

是否有任何解决方案可以避免不必要的冗长但又不会遇到这些问题?

我想使用log 功能的原因是我可能想禁用/启用它或在​​单个位置更改格式。

【问题讨论】:

    标签: python function python-3.x argument-passing


    【解决方案1】:

    你知道logging 模块,我知道吗?

    我只会使用预先形成的消息,并在以下位置替换必要的位:

    movedmsg = "object moved from = %s to = %s"
    print(movedmsg % (object.location, new_location))
    

    您可能更喜欢新的字符串格式:

    movedmsg = "object moved from = {0} to = {1}"
    print(movedmsg.format(object.location, new_location))
    

    如果您确实需要使用类似字典的结构,您可以创建一个 OrderedDict。但这有点冗长。这并不是真正的“一种明显的方法”。

    【讨论】:

    【解决方案2】:

    我能想到的最简洁的解决方案是传入一个键/值对元组。

    def log(action, *details):
        print('object', action, end = '')
        for var, value in details:
            print(var, '=', value, end = '')
        print()
    
    log("moved", ("from", obj.location), ("dest", new_location))
    

    您可以编写一个函数来捕获格式字符串并返回另一个执行实际日志记录的函数。如果您要经常使用单一格式,这可能会很有用。

    def makelogger(*format):
        def logger(action, *args):
            print("object", action, format % args)
        return logger
    
    logger = makelogger("from = %s dest = %s")
    logger("moved", obj.location, new_location)
    
    # do a one-off
    makelogger("from = %s dest = %s")("moved", obj.location, new_location)
    

    只是一些想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      相关资源
      最近更新 更多