Seite 1 von 1

Versionen vergleichen

Verfasst: Mittwoch 17. November 2010, 19:45
von anogayales
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

Re: Versionen vergleichen

Verfasst: Mittwoch 17. November 2010, 19:52
von 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

Re: Versionen vergleichen

Verfasst: Mittwoch 17. November 2010, 20:05
von anogayales
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

Re: Versionen vergleichen

Verfasst: Mittwoch 17. November 2010, 20:14
von cofi
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

Re: Versionen vergleichen

Verfasst: Mittwoch 17. November 2010, 20:25
von anogayales
Vielen Dank! Um einiges eleganter als meine Lösung!