我写了一个小帮手函数来检查我在过去x
小时/分钟/天内添加到Flask-SQLAlchemy表中的电影数量:
#### Check how many movies were added in the last X (hours, minutes) Y (int)
def movies_added_last(x,y):
current_time = dateconvert.arrow.utcnow().naive
tf_hours_ago = current_time - timedelta(x = y)
movies_within_the_last_tf = models.Movie.query.filter(models.Movie.timeadded > tf_hours_ago).count()
print movies_within_the_last_tf
目标是能够像这样调用它:(小时,24)或(分钟,10)。
首先,timedelta()
将x
识别为无效属性,因为它只接受hours
,minutes
和weeks
等参数。 timedelta()
并未将x
视为变量。
如何使此功能正常工作?
修改
我应该更好地解释一下自己:
x
应该是传递给timedelta的格式参数,而y
应该是整数参数,所以当我调用movies_added_last(seconds, 60)
时,我希望在最后60秒,另一种说法是我希望内部timedelta评估为timedelta(seconds = 60)
。
答案 0 :(得分:2)
我认为您希望使用:timedelta(**{x:y})
而不是timedelta(x=y)
。
使用后者,您将名为x
(值为y
)的默认参数传递给timedelta
。对于前者,您将传递一个默认参数,其名称为x
的值(仍然值为y
)到timedelta
。 e.g。
>>> from datetime import timedelta
>>> x = 'hours'
>>> timedelta(x=3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'x' is an invalid keyword argument for this function
>>> timedelta(**{x:3})
datetime.timedelta(0, 10800)
如果你这样做,那么你就像这样调用你的函数:
movies_added_last('seconds', 60)
movies_added_last('minutes', 20)
# etc.
其他替代方案(可能更清晰)是将函数解包关键字参数:
def movies_added_last(**kwargs):
current_time = dateconvert.arrow.utcnow().naive
tf_hours_ago = current_time - timedelta(**kwargs)
movies_within_the_last_tf = models.Movie.query.filter(models.Movie.timeadded > tf_hours_ago).count()
print movies_within_the_last_tf
现在,您可以使用可用于调用timedelta
的任何关键字参数调用此方法:
movies_added_last(seconds=60)
movies_added_last(minutes=20)
# etc.