繁体   English   中英

在此函数中传递kwargs的最pythonic方法是什么?

[英]What is the most pythonic way to pass kwargs in this function?

我想在我的Django测试中创建一个用于创建问题对象的快捷功能。

我不喜欢一直输入new_q(timedelta(minutes=1))类的东西,我只想写一次timedelta并能够以一种很好的方式将其参数传递给new_q函数。

是否有任何Pythonic的单行解决方案,其中我不必将kwargs捕获到变量中,然后在新行中创建timedelta对象?

from datetime import timedelta
from django.utils import timezone


def new_q(question_text = '', offset=timedelta(**kwargs)):
    time = timezone.now() + offset
    return Question.objects.create(question_text=question_text, pub_date=time)

用法:

test1 = new_q(minutes=1)
test2 = new_q('yo?', seconds=1)
test2 = new_q(question_text = 'maw?', hours=11)
test2 = new_q(question_text = 'maw?')
test2 = new_q('yo?')
def new_q(question_text = '', **kwargs):
    time = timezone.now() + timedelta(**kwargs)
    ...

这仍然很简洁:它两次提到kwargs ,但是没有offset或其他任何多余的东西。

您要在此处编写的内容不太有意义:

def new_q(question_text = '', offset=timedelta(**kwargs)):

这将为offset创建一个默认值,并且通过在定义函数时在kwargs中碰巧发生的任何事情调用timedelta(**kwargs)来创建该值。 (这可能什么都不是,因此您会收到NameError 。)

您想要的是这样的:

def new_q(question_text = '', offset=None, **kwargs):
    if offset is None:
        offset = timedelta(**kwargs)

现在,您要在调用timedelta时(而不是在定义函数时)调用timedelta ,并使用传递给函数的kwargs的值,而不是变量在函数定义时具有的任何值。

当然,您可以添加一些错误处理,因此,针对未知关键字参数获得的TypeError提到了new_q而不是timedelta ,因此指定offsetminutes都是错误的,依此类推。

另外,如果某人既未传递offset也未传递任何其他关键字参数,则将创建一个timedelta() -这是一个空的timedelta (0秒)。 那是你要的吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM