Versionen vergleichen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Hi Community,

ich steh gerade vor der Aufgabe zwei Versionsstrings miteinander zu vergleichen.
Eine Version wird bei mir im Programm als

Code: Alles auswählen

__version__ = '0.0.2'
hinterlegt. Ist das gängig das so zu machen?

Wie kann ich nun einen Vergleich implementieren der zum Beispiel sagt, dass '0.1.2' > '0.0.2' ist. Wird das so auch in anderen Projekten gemacht, oder hilft man sich da einfach in dem man einen Counter bei jeder Versionsinkrementierung hochzählt?

Es wäre nett wenn ihr mir da helfen könntet, da ich sowas noch nie implementieren musste. :)

Grüße,
anogayales
BlackJack

Falls es immer Punkte sind und immer nur Zahlen dazwischen, dann sollte es doch recht einfach sein:

Code: Alles auswählen

In [55]: v_1, v_2 = '0.1.2', '0.0.2'

In [56]: def f(v): return map(int, v.split('.'))
   ....: 

In [57]: f(v_1)
Out[57]: [0, 1, 2]

In [58]: f(v_1) > f(v_2)
Out[58]: True

In [59]: f(v_1) < f(v_2)
Out[59]: False
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Das ist ja schonmal was!

Wenn man das ganze jetzt auf Buchstaben erweitern will. Sprich v_1, v_2 = '0.1.2', '0.0.2dev'.

Mir ist klar, dass man auf Versionsstrings nicht so ohne weiteres eine Sinnvolle Ordnungsrelation definieren kann.

Vorschlag:
Man eliminiert nicht-Integer aus dem gesplitteten String. Falls das leere Wort vorkommt ersetzt man es durch die Zahl 0.

Code: Alles auswählen

v = "0.01.dev"
ref = "0123456789"


def g(x):
    try:
        return int("".join(p for p in x if p in ref))
    except ValueError:
        return 0

def f(x):
    return map(g, v.split("."))
    

print f(v)
Geht das noch eleganter. Ich probier mal :)

Grüße,
anogayales
Zuletzt geändert von anogayales am Mittwoch 17. November 2010, 20:15, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Wenn du Tupel statt Strings verwendest kommst du um Verrenkungen herum:

Code: Alles auswählen

In [6]: v == (0,1,2)
Out[6]: True

In [7]: v = (0,1,2)

In [8]: v2 = (0,1,2,"dev")

In [9]: v < v2
Out[9]: True

In [10]: v == (0,1,2)
Out[10]: True

In [11]: v > (0,1,0)
Out[11]: True

In [12]: v > (0,1,1)
Out[12]: True

In [13]: v > (0,2,1)
Out[13]: False

In [14]: v2 < (0,2,1)
Out[14]: True
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Vielen Dank! Um einiges eleganter als meine Lösung!
Antworten