Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TypeError:start_end_period()获取了意外的关键字参数';月份';_Python - Fatal编程技术网

Python TypeError:start_end_period()获取了意外的关键字参数';月份';

Python TypeError:start_end_period()获取了意外的关键字参数';月份';,python,Python,我正在与这个错误作斗争。由于可以执行relativedelta.relativedelta(test),其中某些内容可以直接是months=1ofyears=1,因此我希望直接通过test作为start\u end\u period()方法的参数 TypeError: start_end_period() got an unexpected keyword argument 'months' 我如何调整此方法,使其能够与单个参数或关键字参数一起工作,因为relativedelta(7)和rel

我正在与这个错误作斗争。由于可以执行
relativedelta.relativedelta(test)
,其中某些内容可以直接是
months=1
of
years=1
,因此我希望直接通过
test
作为
start\u end\u period()
方法的参数

TypeError: start_end_period() got an unexpected keyword argument 'months'

我如何调整此方法,使其能够与单个参数或关键字参数一起工作,因为
relativedelta(7)
relativedelta(months=1)
都很好?

首先,您不能将月份或年份传递给需要周期,但不需要天、月或年的函数。将函数声明为获取您希望它获取的内容

然后需要将它们传递给relativedelta构造函数。这是最简单的方法

start_date = CustomerProfile.objects.filter(user__date_joined__gte=entry_date_production).first().user.date_joined
def start_end_period(period):
                start = start_date - relativedelta.relativedelta(period)
                end = start + relativedelta.relativedelta(period - 1)
                return start, end
但是,您应该改为使用**kwargs,它将通过传递给函数的任何内容自动支持relativedelta的所有选项

from dateutil.relativedelta import relativedelta

def start_end_period(start_date, days=0, months=0, years=0):
    period = relativedelta(days=days, months=months, years=years)
    start = start_date - period
    end = start + period + relativedelta(days=1)
    return start, end

import datetime
start_date = datetime.date(year=2017, month=3, day=1)
print (start_date)

print (start_end_period(start_date, days=7))
print (start_end_period(start_date, months=2))
print (start_end_period(start_date, years=1))

由于dateutil.relativedelta是一个已建立的可下载模块,我假设您对他们添加可变大小日期的规则感到满意。使用月份作为差异的概念存在风险,但真正的规则是永远不要编写与日期相关的代码,使用dateutil至少可以满足这一点。
def start_end_period(start_date, **kwargs):
    period = relativedelta(**kwargs)