【问题标题】:Is there a pythonic way to log a function with extra values without bloating its paramter list?有没有一种 Pythonic 的方式来记录一个带有额外值的函数而不会使它的参数列表膨胀?
【发布时间】:2021-03-05 11:50:31
【问题描述】:

我目前正在努力以一种干净的方式在 python 中记录一个函数。

假设我想记录一个函数,它有一个不起眼的 list_of_numbers 作为参数。


def function_to_log(list_of_numbers):
    
   # manipulate the values in list_of_numbers ...
   
   return some_result_computed_from_list_of_numbers

list_of_numbers 中的值在上述函数中被操作时,我想记录该更改,但不是使用晦涩的list_of_numbers 中的值,而是第二个列表@987654325 中相同索引处的值@。

让我烦恼的事情:现在我还必须输入list_with_names_for_log,这会使我的函数的参数列表膨胀,


def function_to_log(list_of_numbers, list_with_names_for_log):

    # do some stuff like, change value on 3rd index:
    list_of_numbers[3] = 17.4
    log.info('You have changed {} to 17.4'.format(list_with_names_for_log[3]))
    # and so on ...

    return some_result_computed_from_list_of_numbers

我使用这些列表中的多个专门用于登录此功能。 有没有人知道如何让它更干净一点?

【问题讨论】:

  • 可用于list_with_names_for_log 参数的列表是否与函数在同一范围内?调用表达式如何决定使用哪个列表?
  • 是的,列表驻留在一个调用function_to_log 的母函数中,并将它们作为额外的参数。要使用哪个列表在function_to_log 中硬编码:对于某些操作,我只使用一个list_with_names 进行日志记录,对于某些操作,这些列表的组合。
  • 您的问题中可能没有足够的细节来为您的情况提供足够的解决方案。正如 Carcigenicate 指出的那样,您有成对的列表,这些列表通过它们的索引关联,因此 Carcigenicate 的解决方案可能会解决您拥有不需要的 extra 函数参数的问题。如果返回值和参数之间存在关系,您可以检查返回值并在调用函数中进行日志记录。也许使用数据值的描述符并设计描述符以在更改时记录。或者 Carcigenicate 的 NamedData 类可以设计为在更改时记录。

标签: python logging functional-programming


【解决方案1】:

如果对数据进行分组有意义,我会将名称/数据对分组到一个结构中。您目前拥有的基本上是"parallel lists",这通常是一种气味,除非您使用的语言是您唯一的选择。

可以引入一个简单的数据类:

from dataclasses import dataclass

@dataclass
class NamedData:
    name: str
    data: int

然后:

def function_to_log(pairs):
    pairs[3].data = 17.4
    log.info('You have changed {} to 17.4'.format(pairs[3].name))
    # and so on ...

return some_result_computed_from_list_of_numbers

作为数据样本:

pairs = [NamedData("Some Name", 1), NamedData("Some other name", 2)]

如果您有两个单独的列表,则很容易适应:

pairs = [NamedData(name, data) for name, data in zip(names, data_list)]

仅当您通常在使用每个列表的大多数地方都需要这两个位时才这样做。只有在大多数使用名称和数据的地方都需要名称和数据时,分组才会有助于清理代码。否则,您只是在其他地方引入开销和膨胀来清理一些调用。

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2013-11-18
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多