2009-08-14 43 views
0

我在我的Rails應用程序一點的一行返回了一系列版權日期與可選參數,如:的Ruby到Python的單行轉換

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

我在移動應用Django,雖然我喜歡它,但我錯過了一些簡潔。在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' 

回答

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]))) 
+0

尼斯。感謝您及時的回覆。 – 2009-08-14 22:03:49

+0

我能夠把它放到「 - 」.join(如果我排除了列表理解,我可以將它縮小到「 - 」.join(map(str,sorted(set([start_year,datetime.now()。year]))))。 – 2009-08-14 22:08:06

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))) 
+0

還不錯,只有缺少的東西是排序,如果由於某種原因,我決定通過未來的日期。這是我使用列表和集合的唯一原因。我會用預期的輸出更新問題。 – 2009-08-14 22:09:21

+0

當您只處理兩件物品時,無需進行排序。我相信訂單問題現在是固定的。 – tzot 2009-09-13 21:17:03

5

當心被評估一次的默認參數。因此,如果您的Web應用程序在12/31/09之後運行而不重新啓動,則無法獲得預期的輸出。

嘗試:

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]))