【问题标题】:reducing redundancy when defining functions by providing arguments through decorators (bad idea?)通过装饰器提供参数来减少定义函数时的冗余(坏主意?)
【发布时间】:2021-03-20 20:33:37
【问题描述】:

我正在编写的一个包正在不断扩展,但是很多函数都采用相同的参数(例如 overwrite=True 之类的东西)。我正在考虑通过全局设置默认参数来减少一些冗余的方法。我尝试过使用装饰器(这就是它们的用途,对吗?[seen here])

所以,而不是

def function1(unique_arg1=1, unique_arg2=2, overwrite=True, feedback=False):
    print(locals())
    pass

function1()
        

我尝试过类似的方法

## define in settings.py    
default_args_dict = {
    "overwrite": True,
    "feedback": False}

def add_defaults(func):
    def inner(default_args=default_args_dict):
        return func(**default_args)
    return inner

## script.py
from settings import add_defaults

@add_defaults
def function1(unique_arg1=1, unique_arg2=1, **kwargs):
    print(locals())
    pass
    
function1()

不幸的是,传递可选参数不再起作用:

## doesn't work 
function1(overwrite=False)

TypeError: inner() got an unexpected keyword argument 'overwrite'

有人可以帮我吗?而且,更重要的是,这是一个糟糕的主意吗?

【问题讨论】:

  • 也许将参数放入一个对象中,并为该对象提供一个提供默认值的构造函数?

标签: python


【解决方案1】:

问题是,default_args=default_args_dict 是一个名为 default_args 的关键字参数,您默认使用字典。您应该改为使用关键字参数,并将您的默认值与传递的内容合并。

def inner(**default_args):
    default_args = default_args_dict | default_args
    return func(**default_args)

如果您使用的是旧版本的 Python,而不是 | 行,您可以使用

default_args = {**default_args_dict, **default_args}

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 2022-01-08
    • 1970-01-01
    • 2012-06-22
    • 2023-03-31
    • 2014-08-28
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多