Code kürzer/schöner machen

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
Benutzeravatar
MaximalMax
User
Beiträge: 18
Registriert: Sonntag 3. Mai 2020, 00:51

Ich habe hier 2 Datein, einmal das Python-Script und den JSON-File:

Code: Alles auswählen

import json

with open('data.json') as file:
    data = json.load(file)['Steckbrief']

print(f"Name: {data['name']} \nAlter: {data['alter']}")

Code: Alles auswählen

{"Steckbrief":
  {
    "name": "Max",
    "alter": 13
  }
}
Liebe Grüße :D
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und was soll daran schöner werden?
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Indem man file nicht überschreibt?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@darktrym: Pssst, Python 2 ist tot, es gibt kein `file` mehr.

@MaximalMax: Vor schön kommt immer erst einmal korrekt. Die JSON-Datei muss man entweder mit UTF-8 als Kodierung öffnen oder als Binärdatei.

Ansonsten würde ich das länger machen, damit es schöner und wird, nicht kürzer: Alles was zu einem Programm fehlt ergänzen.

Code: Alles auswählen

#!/usr/bin/env python3
import json


def main():
    with open("data.json", "rb") as file:
        data = json.load(file)["Steckbrief"]

    print(f"Name: {data['name']}\nAlter: {data['alter']}")


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wobei hier die Variante mit format() IMHO auch nicht gerade unelegant ist:

Code: Alles auswählen

>>> data = {"name": "Bob", "alter": 42}
>>> print("Name: {name}\nAlter: {alter}".format(**data))
Name: Bob
Alter: 42
Oder wenn man die "Sternchen-Syntax" nicht nutzen möchte, geht es auch so:

Code: Alles auswählen

print("Name: {name}\nAlter: {alter}".format_map(data))
Und wenn viele Angaben gebraucht werden, kann man natürlich eine Schleife laufen lassen:

Code: Alles auswählen

print("\n".join(f"{key.capitalize()}: {value}" for key, value in data.items()))
Benutzeravatar
DeaD_EyE
User
Beiträge: 1240
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Ich wünschte, es gäbe in Python einen einfachen Weg auf Werte in den Dicts mit dem Punkt zuzugreifen zu können.
Das Problem ist, dass nicht jeder String ein gültiger Name ist.


Hier mal ein Beispiel mit AttrDict:

Code: Alles auswählen

import json

from attrdict import AttrDict
# pip3 install attrdict


def get_steckbrief():
    with open('data.json') as file:
        return AttrDict(json.load(file)).Steckbrief


if __name__ == "__main__":
    data = get_steckbrief()
    print(f"Name: {data.name} \nAlter: {data.alter}")
Bitte nicht im Dreieck springen und freuen. AttrDict ist leider nicht die Wollmilchsau wie ich mir erhofft habe.
Der Zugriff ist in Ordnung. Zuweisungen von nicht existierenden Keys führen ins Nirwana und
ungültige Namen werden nicht in Attribute umgewandelt und aus Listen werden Tupel.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

@DeaD_EyE: Kennst du `addict`? Das macht einige von den Punkten, die du aufgezählt hast, so wie du das möchtest.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1240
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

narpfel hat geschrieben: Donnerstag 15. Oktober 2020, 17:31 @DeaD_EyE: Kennst du `addict`? Das macht einige von den Punkten, die du aufgezählt hast, so wie du das möchtest.
Ja, sieht sehr vielversprechend aus. Damit werde ich meinen Werkzeugkasten erweitern. Danke für den Tipp :-)
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten