将参数传递给内部函数

时间:2015-11-11 03:30:02

标签: python function datetime flask-sqlalchemy

我写了一个小帮手函数来检查我在过去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识别为无效属性,因为它只接受hoursminutesweeks等参数。 timedelta()并未将x视为变量。

如何使此功能正常工作?

修改

我应该更好地解释一下自己:

x应该是传递给timedelta的格式参数,而y应该是整数参数,所以当我调用movies_added_last(seconds, 60)时,我希望在最后60秒,另一种说法是我希望内部timedelta评估为timedelta(seconds = 60)

1 个答案:

答案 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.