这或许似乎微不足道,但这是我经常遇到的一个条件,并希望找到一种更优雅的方式来编写这段代码。该方法虽然与问题不是非常相关,但它采用文本值和可选的is_checked值来创建单选按钮(使用dominate)。在这种情况下,我不能将'checked'设置为None,或者设置为false - 它必须存在或不存在。似乎我不应该两次写'输入'行,只是为了选择性地添加一个参数。
mv
这将是我的第二种方法,但它是相同的代码行,而且可读性较差 - 尽管可能更干一些。
cp
问题:如何在不牺牲可读性的情况下以尽可能少的行处理此代码案例?
答案 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)