Ruby到Python的一行代码转换

0 投票
3 回答
709 浏览
提问于 2025-04-15 13:36

我在我的Rails应用里有一行简单的代码,可以返回一系列的版权日期,还可以加一个可选的参数,比如:

def copyright_dates(start_year = Date.today().year)
    [start_year, Date.today().year].sort.uniq.join(" - ")
end

我正在把这个应用转到Django上,虽然我很喜欢Django,但我还是有点怀念Rails的简洁。用Python写同样的方法看起来是这样的:

def copyright_dates(start_year = datetime.datetime.today().year):
    years = list(set([start_year, datetime.datetime.today().year]))
    years.sort()
    return " - ".join(map(str, years))

我已经有好几年没碰Python了,所以我觉得可能有更简单的方法来实现这个功能。有没有什么建议?

补充说明:我知道用列表和集合可能有点过于复杂,但我希望在2009年运行这段代码时能得到以下输出:

copyright_dates()     # '2009'
copyright_dates(2007) # '2007 - 2009'
copyright_dates(2012) # '2009 - 2012'

3 个回答

2

我觉得列表和集合用起来有点过于复杂了。

那这样怎么样:

def copyright_dates(start=datetime.datetime.today().year):
    now = datetime.datetime.today().year
    return (start==now and str(now) or "%d - %d" % (min(start, now), max(start, now)))
5

注意,默认参数只会被计算一次。所以如果你的网页应用在2009年12月31日运行而没有重启,你可能得不到预期的结果。

可以试试:

def copy(start=None):
    start, curr = start if start else datetime.today().year, datetime.today().year
    return str(start) if start == curr else '%d - %d' % tuple(sorted([start, curr]))
5
from datetime import datetime

def copyright_dates(start_year = datetime.now().year):
    return " - ".join(str(y) for y in sorted(set([start_year, datetime.now().year])))

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得简单易懂。

撰写回答