2009-08-14 11 views
0

Ich habe einen kleinen Einzeiler in meiner Rails-Anwendung, die eine Reihe von Copyright Daten mit einem optionalen Parameter gibt, zB:Ruby python Einzeiler Umwandlung

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

Ich ziehe die App über Django, und während ich es liebe, vermisse ich ein bisschen die Prägnanz. Die gleiche Methode in Python wie folgt aussieht:

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

Es ist Jahre her, dass ich Python berührt habe, so ich wette, gibt es einen einfacheren Weg, es zu tun. Irgendwelche Ideen?

EDIT: Ich weiß, Listen und setzt ein wenig übertrieben, aber ich möchte die folgende Ausgabe den Code unter der Annahme ausgeführt wird in 2009:

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

Antwort

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

Nizza. Danke für die schnelle Antwort. –

+0

Ich konnte es auf "-" .join (map (str, sortierte (set ([start_year, datetime.now(). Jahr])))) wenn ich das Listenverständnis weggelassen. –

2

Listen und Sätze scheinen übertrieben zu sein mir.

Wie wäre es damit:

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

Auch nett, nur fehlende Sache ist die Sorte, wenn ich mich aus irgendeinem Grund dafür entschieden habe, ein zukünftiges Date abzugeben. Das ist der einzige Grund, warum ich die Listen und Sets verwende. Ich werde die Frage mit der erwarteten Ausgabe aktualisieren. –

+0

Keine Sortierung, wenn Sie nur mit zwei Elementen arbeiten. Das Bestellproblem ist jetzt behoben, glaube ich. – tzot

5

Achten Sie auf die Standardparameter aus, die einmal ausgewertet wird. Wenn Ihre Webanwendung über 12/31/09 ohne Neustart ausgeführt wird, erhalten Sie nicht die erwartete Ausgabe.

Versuchen:

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