Kurze Frage zur Effizienz eines Snippets (for-Loops...)

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.
greetings1
User
Beiträge: 51
Registriert: Donnerstag 22. Oktober 2020, 18:19

Ist dieses Wörterbuch als globale Variable/Konstante sinnvoll?

Code: Alles auswählen

my_const = {
    "sol_dist": 450,
    "sta_dist": 5000,
    "sys_dist": 20,
    "min_supply": 5000,
    "max_buy": 100000,
    "max_age": 48,
    "loops_threshold": 10000,
}
Ich hab alle "magischen Werte" durch my_const[...]-Aufrufe ersetzt. Macht man das so in Python?
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, das macht man nicht, Konstanten werden einfach nur KOMPLETT_GROSS geschrieben. Abkürzungen benutzt man nicht. Was hat der Abstand zur Sonne oder zu einem Stern mit dem Problem zu tun?

Code: Alles auswählen

SOL_DISTANCE = 450
STAR_DISTANCE = 5000
SYSTEM_DISTANCE = 20
MINIMUM_SUPPLY = 5000
MAX_BUY = 100000
MAX_AGE = 48
LOOPS_THRESHOLD = 10000
greetings1
User
Beiträge: 51
Registriert: Donnerstag 22. Oktober 2020, 18:19

Hat mit der Filterung der Eingabedatenmenge zu tun.
greetings1
User
Beiträge: 51
Registriert: Donnerstag 22. Oktober 2020, 18:19

Habe jetzt auf "global" komplett verzichtet und das so gemacht:

Code: Alles auswählen

import json
import csv
import math
import os
import psutil
import inspect
from datetime import datetime


class MyData:
    timestamp = datetime.timestamp(datetime.now())
    my_const = {
        "sol_dist": 300,
        "sta_dist": 5000,
        "sys_dist": 30,
        "min_supply": 5000,
        "max_buy": 100000,
        "max_age": 48,
        "loops_threshold": 30000,
        ## 10000
    }
    systems: list = []
    systems_dic: dict = {}
    stats: list = []
    stats_dic: dict = {}
    listings: list = []
    listings_dic: dict = {}
    coms: list = []
    coms_dic: dict = {}


md = MyData()


def ...


parse_systems(md)
parse_stats(md)
parse_listings(md)
parse_coms(md)
calc_1(md)
Also jede Funktion wird mit dem "md"-Objekt aufgerufen, und dieses hält einerseits die Konstanten und auch die Daten. Ist das besser so? Bei Bedarf kann ich auch den gesamten Code posten (ca. 300 Zeilen...)

Vielen Dank
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Klasse ist kompletter Quatsch. Du hast zwar nicht global benutzt, aber doch nur eine Menge globaler Variablen in einen Klassenkontext gepackt. Die Typ-Annotationen sind mal wieder überflüssig, weil der Typ der Variablen aus der Initialisierung klar ist.
MyData ist das My-Präfix unnötig, weil nichtssagend. md ist dann komplett nichtssagend. Benutze keine Abkürzungen. Und da Du keinen sprechenden Namen finden wirst, ist das schon ein Anzeichen dafür, dass das Datendesign schlecht ist.
greetings1
User
Beiträge: 51
Registriert: Donnerstag 22. Oktober 2020, 18:19

Wie soll es denn anders gehen? Die Funktionen brauchen eine Menge an Daten, auf denen sie operieren und die sie verändern...
Benutzeravatar
__blackjack__
User
Beiträge: 14030
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@greetings1: Die sollten weniger verändern. `parse_*()`-Funktionen die gar nichts zum Parsen übergeben bekommen, aber viele leere Datenstrukturen sind schon mal sehr komisch. Eine Funktion die Daten parst bekommst üblicherweise einen Dateinamen übergeben und liefert eine *neue* Datenstruktur mit den geparsten Daten als Rückgabewert.

Das die Daten alle als Pärchen von Wörterbuch und Liste daherkommen ist auch komisch. Falls die Zusammengehören und da Invarianten bestehen, dann wäre *das* zum Beispiel ein Kandidat für eine Klasse. Also eine echte, von der auch Exemplare erstellt und verwendet werden, statt sie nur als globalen Namensraum zu missbrauchen. Auf Klassenebene gehören in der Regel nur Konstanten. Eben weil das sonst globale Variablen wären.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten