sys.argv Element zerlegen in ein Tuple

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Moinsen,

    wieder einmal benötige ich einen kleinen Denkanstoß.
    mit dem Code:

    Python
    arguments = sys.argv[1:]

    ermittle ich die Übergabe Argumente / Parameter die bei Programmaufruf übergeben wurden.
    Nun möchte ich mit einem Parameter -c:(x,y,z) eine RGB Farbe, oder auch mehrere -c:((x1,y1,z1),(x2,y2,z2)) Farben für eine Filterfunktion übergeben. Den Teil nach dem : abzusplitten gelingt mir noch mit Colors = arguments[i].split(':')[-1].
    Nun liegt mir der Teil nach dem Doppelpunkt als STR vor.
    Wie bekomme ich das auf dem einfachsten Weg hin, daß ich dann die RGB Farbenwerte entweder als (128,128,25) als Tuple, oder als LIST mit mehreren Tuple in der Form [(x1,y1,z1), (x2,y2,z2)] erhalte ohne das diese Zahlen immer noch STR sind ?
    Entweder ich habe eine Abfolge in der Form:

    oder irgendwas anderes. Aber bei der Mehrfachaneinanderreihung mehrere () innerhalb der äußeren () geht mir dann auch die Zusammenfassung mit jeweils 3 Werten verloren.

    Gibt es hierfür eine einfache Lösung, oder muß ich das mit wiederholten Schleifen umsetzen. Diesen String nochmals nach ',' aufzusplitten bringt mich hier irgendwie nicht weiter.

    Franky

    Franky

  • Hallo,

    hier habe ich das mal detailliert und mit möglichst sprechende Namen, dass du siehst was gemacht wird, aufgeschrieben:

    Und zusammengefasst im Code:

    Code
    arguments = "-c:(125,25,30)"
    colors = [int(color) for color in arguments.replace('-c:', '').replace('(', '').replace(')', '').split(',')]
    print(colors)
    print(type(colors[0]))

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • ast.literal_eval kann weiterhelfen.

    Eins vorweg, die Entwickler haben in der Doku eine fette rote Warnung eingebaut:

    Zitat

    Warning: It is possible to crash the Python interpreter with a sufficiently large/complex string due to stack depth limitations in Python’s AST compiler.


    It can raise ValueError, TypeError, SyntaxError, MemoryError and RecursionError depending on the malformed input.

    In dem Beispiel fange ich nur ValueError explizit ab.

  • Moinsen DeaD_EyE,

    Danke für dein Codebeispiel. Nur enthält das Ergebnis einige Fehler, die mir noch mehr Probleme bereiten würden.

    Code
    # python a.py -c "(1,2,3)" # Geht 
    # python a.py -c "[1, 2,3)" # Ist keine Tuple 
    # python a.py -c "1"    # Fehler 
    # python a.py -c "(1)"  # nicht ok 
    # python a.py -c "(1,)" # ok 
    # python a.py -c "(([(1,2,3)]),([1,2,3]))" # geht auch

    Zeile 1 wunderbar
    Zeile 2 richtige Feststellung -> Verwerfen ?
    Zeile 3 Wunderbar - Verwerfen ?
    Zeile 4 auch richtig
    Zeile 5 RGB braucht 3 Werte nicht nur 2 Werte
    Zeile 6 Typenverdrehung Tuple in List wird benötigt. Dann eher so [(1,2,3), (4,5,6),(7,8,9)]

    Ich habe erst einmal einen Lösungsansatz und werde mal weiter am Code feilen.

    Schönen Feiertag
    Franky

    Franky

  • Ohne -c, das kannst du ja schon:

  • Was spricht gegen Hex-Triplets?

    Wird auch oft im Web verwendet:

    Code
    def hex2rgb(hex_value: str):
        value = int(hex_value.removeprefix("#"), 16)
        value = max(0, min(value, 2**24-1))
        r = (value >> 16) & 0xFF
        g = (value >>  8) & 0xFF
        b = value & 0xFF
        return r, g, b
    Zitat

    >>> hex2rgb("#FF00AA")

    (255, 0, 170)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!