Python:为方法调用添加可选参数的更优雅方式

时间:2017-05-31 05:55:21

标签: python python-3.x optional-parameters keyword-argument

这或许似乎微不足道,但这是我经常遇到的一个条件,并希望找到一种更优雅的方式来编写这段代码。该方法虽然与问题不是非常相关,但它采用文本值和可选的is_checked值来创建单选按钮(使用dominate)。在这种情况下,我不能将'checked'设置为None,或者设置为false - 它必须存在或不存在。似乎我不应该两次写'输入'行,只是为了选择性地添加一个参数。

mv

这将是我的第二种方法,但它是相同的代码行,而且可读性较差 - 尽管可能更干一些。

cp

问题:如何在不牺牲可读性的情况下以尽可能少的行处理此代码案例?

2 个答案:

答案 0 :(得分:5)

您的代码看起来很好,但明显是a的命名,可能是input_opts或类似的。

使其更清晰的另一种可能性是对常见内容使用直接关键字参数,并使用**注入可选的参数。当只有一个是可选的时,这可能很短,例如:

checked_arg = {'checked': 'checked'} if is_checked else {}
with label(text, cls="radio-inline") as lbl:
    input(text, type="radio", name="optradio", **checked_arg)

答案 1 :(得分:2)

仅作为概念:)您可以用这种方式装饰自己或外星人(库)功能。更重要的是,你可以将装饰器作为类(使用__call__方法来装饰底层函数),这可以用简单的"态射"进行参数化。底层函数参数(它们可能是函数列表 - 作为装饰器类构造函数的参数)。你也可以制作更多的声明式样式装饰器并检查底层函数参数(例如默认值) - 你只受自己的幻想限制:)所以:

from functools import wraps

def adapt_gui_args(callable):
    @wraps(callable)
    def w(*args, **kwargs):
        if kwargs.pop('is_checked', False): kwargs['checked'] = 'checked'
        return callable(*args, **kwargs)
    return w

# may be decorated with adapt_gui_args if it's your function
def input(*args, **kwargs):
    print("args: ", args)
    print("kwargs: ", kwargs)

# decorate input function outside its source body
input = adapt_gui_args(input)

def test(is_checked=False):
    input(1, 2, type="radio", is_checked=is_checked)

test(False)
test(True)