@kasi45: Ah, da gibt es jetzt einiges an Informationen mehrfach, weil Sirius3 schneller war mit posten.
Wie immer Anmerkungen zum Code: Das `i` kein guter Name für etwas anderes als ganze Zahlen ist, habe ich ja schon mal erwähnt.
`os.path.join()` & Co sind mittlerweile vom `pathlib`-Modul abgelöst. Die Funktion wird auch zweimal verwendet um beim zweiten Mal ein Teilergebnis zu bekommen, was man beim ersten mal schon hatte.
``continue`` versuche ich so weit möglich zu vermeiden, und das ist eigentlich so gut wie immer möglich. Das ist ein Sprung den man der Einrückung nicht ansieht, und es macht es schwieriger Code aus Schleifen in Funktionen/Methoden heraus zu ziehen, oder etwas am Ende jedes Schleifendurchlaufs hinzuzufügen.
In diesem Fall führt das nicht mal zu einer tieferen Einrückung, weil man die geschachtelte ``if``-Bedingung einfach mit in das umschliessende ``if`` aufnehmen kann.
Und nochmal ein Fall von „Grunddatentypen gehören nicht in Namen“ — schön anschaulich warum das keine gute Idee ist: ``sourceDict.append()`` ist falsch. Wörterbücher haben keine `append()`-Methode, das scheint eine Liste zu sein.
``pass`` sollte nirgends stehen wo es keinen Zweck erfüllt.
Das könnte dann so aussehen (ungetestet):
Code: Alles auswählen
sources = []
for subfolder_name in source_subfolder_names:
subfolder_path = source_folder_path / subfolder_name
for module_info in pkgutil.walk_packages([str(subfolder_path)]):
if not module_info.ispkg and enabled_check(module_info.name):
try:
spec = importlib.util.spec_from_file_location(
module_info.name,
subfolder_path / f"{module_info.name}.py",
)
if spec:
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
sources.append((module_info.name, module.source()))
except Exception as error:
__addon__.setSetting(
f"provider.{module_info.name}", "false"
)
if debug:
log_utils.log(
f"Error: Loading module: {module_info.name!r}: {error}",
log_utils.LOGERROR,
)
return sources
Bei `_getSource()` sehe ich wieder Probleme mit Namen. Wir hatten eben schon `sources` und Module mit einer `source`-Funktion. Dann die Funktion `_getSource()` die ein Argument `source` bekommt und Obwohl sie nur `_getSource()` — Einzahl — heisst, eine Liste um mehrere Sourcen erweitert. Wobei `source`/`sourcen` hier in mehreren Funktionen/Methoden für sehr unterschiedliche Typen/Datenstrukturen steht. Das ist verwirrend. Endweder sollte das nicht alles etwas mit `source`/`sources` heissen, oder man braucht noch zusätzliche Info im Namen was für eine Quelle das jetzt jeweils ist.
Eine Funktion oder Methode mit `get*` im Namen muss etwas zurückgeben. Das ist eine ziemlich feste Erwartung die man als Programmierer an so einen Namen hat. Und die `_getSource()` sollte das auch tatsächlich machen. Mit dem Ergebnis eine Liste zu erweitern kann der Aufrufer machen. Und dann kann das auch zu einer Funktion werden, denn das Objekt wird dann nicht mehr benötigt.
Das Auslösen der Ausnahme ist ein bisschen sinnlos wenn die gleich in der Funktion wieder mit einem `print()` behandelt wird. Da könnte man dort auch einfach ein `print()` reinschreiben. Oder falls das nicht wirklich ein Ereignis ist, das man so aufbauschen muss, dann ist die gesamte Abfrage unnötig.
Es gibt wieder schlechte namen mit `d` und `t`. Bei `d` kann ich noch erraten wofür das steht, bei `t` wird das schon schwieriger.
Die `dict.update()` ist dazu da wenn man ein Wörterbuch mit einem anderen oder einem iterierbaren Objekt mit Schlüssel-/Wert-Paaren erweitern/aktualisieren möchte. Nicht um *einem* Schlüssel einen Wert zuzuordnen. Dafür erstellt man kein unnötiges Wörterbuch mit diesem einem Paar, was danach dann ja gleich wieder verworfen wird.
Die Funktion könnte dann so aussehen:
Code: Alles auswählen
def _get_sources(titles, year, season, episode, imdb, provider_name, provider):
sources = provider.run(titles, year, season, episode, imdb)
if sources is not None:
for source in map(
json.loads,
{json.dumps(source, sort_keys=True) for source in sources},
):
source["provider"] = provider_name
source.setdefault("priority", 100)
source.setdefault("prioHoster", 100)
return sources