Re: Plugin-basiertes Programm
Verfasst: Mittwoch 28. Juli 2021, 22:03
BITTE LÖSCHEN
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Das habe ich immer gemacht !Eingerückt wird immer mit 4 Leerzeichen pro Ebene, weil das alle machen, und man sonst nicht Deinen Code in anderen Kopieren kann, ohne dass man alle Einrückungen anpassen muß.
Diese 2. Punkte werde ich ändern. Dankeschön.`OM.Builder( Self, ...)` schreibt man nicht, weil Methoden immer über die Instanz referenziert werden: `Self.Builder(...)`.
Man benutzt keine globalen Variablen, auch wenn sie sich in einer Klassendefinition verstecken.
Ich schreibe gerade noch daran und es war für mich in diesem Status OK, dass er None ausgibt.`Load` liefert einmal implizit None zurück und einmal explizit OBJ, das sollte nicht sein, in dem Fall gibt man explizit None zurück, oder aber man löst gleich eine Exception aus, weil man im Fall None nicht sinnvoll weiterarbeiten kann.
Das mit dem OM vorne habe ich geschrieben, weil es Objekte des Object Managers sind.Warum nennst Du in `Builder` `Module` in `OM_Package` um, warum nennst `Module` dann auch noch in `OM_FH` um, und in `OM_Class`? Wenn Du mit einer Variable arbeitest, mußt Du sie nicht erst gleich dem Ergebnis, das Du zum Schluß haben willst, umbenennen.
Ja, das habe ich bereits hier im Forum gelesen, bin aber noch nicht dazu gekommen, es zu ändern.Pfade sind keine Strings, man stückelt sie nicht mit + zusammen, und benutzt auch keinen hart codierten \ als Pfadtrenner. Statt dessen benutzt man pathlib.Path. Das ist platformunabhängig und nicht so fehleranfällig.
Flüchtigkeitsfehler. Danke.Auf False prüft man nicht explizit per == sondern per not. Auch hier löst man eine Exception aus, statt implizit None zurückzuliefern.
Wie gesagt, ermittle ich damit den Namen. Da das Modul theoretischWarum zählst Du, wie viele "::" vorkommen, um das dann mit split zu verwenden? split splittet ohne zweiten Parameter immer an allen Vorkommen.
Wie gesagt, bin ich relativ neu in der Materie und ich habe in irgendeinerUm ein Element einem Wörterbuch hinzuzufügen benutzt man nicht update.
Danke für deinen Beitrag, blackjack.__blackjack__ hat geschrieben: Mittwoch 28. Juli 2021, 21:11 @YAPD: Beim Einrücken der Argumente bis zur öffnenden Klammer spricht dagegen, was alles umformatiert werden muss, wenn sich beispielsweise die Länge des Funktionsnamens ändert. Das sind dann alles Änderungen im Diff/der Versionsverwaltung die nur kosmetisch sind, und es schwerer machen die *eigentliche* Änderung zu erkennen.
Und ja es sind nur Richtlinien. Aber eben auch wieder nicht, weil Du da jedes mal drauf hingewiesen wirst, und viele verbreitete Projekte mittlerweile ein Tool zur Formatierung verwenden das fast gar keine Einstellungsmöglichkeiten hat. Da sieht das dann so aus wenn es nicht mehr in eine Zeile passt, die Argumente selbst aber immer noch auf eine Zeile passen:Die `builder()`-Methode hätte ich `build()` genannt, denn Funktionen und Methoden werden üblicherweise nach der Tätigkeit benannt, die sie durchführen um sie von eher passiven Werten unterscheiden zu können. `builder` wäre ein passender Name für ein komplexeres `Builder`-Objekt.Code: Alles auswählen
result = some_function_that_takes_arguments( "a", "b", "c", "d", "e", "f", "g" )
Offensichtlich kann ich bis 3 zählen.
Das sind keine Objekte sondern alles lokale Variablen. Und bei lokalen Variablen ist es klar, dass sie zu einer Methode gehören, die in der Klasse OM definiert ist. Das OM_ sind also drei Buchstaben, die keinen Mehrwert bieten, sondern nur das Lesen behindern.YAPD hat geschrieben: Mittwoch 28. Juli 2021, 22:06 Das mit dem OM vorne habe ich geschrieben, weil es Objekte des Object Managers sind.
Kann man auch anders machen, aber das ist glaube ich unerheblich.
Du hast eine falsche Vorstellung davon, was Variablen in Python sind; das sind nur Referenzen auf Objekte. Wenn man eine Referenz einer anderen Variable zuweist, werden keine Kopien erzeugt.YAPD hat geschrieben: Mittwoch 28. Juli 2021, 22:06 Ich verändere sowohl OM_FH als auch OM_Class während des Prozesses.
Benutze einen Autoformatter wie `black`, dann kannst du dich zusätzlich noch freuen, dass dein Code immer gleich (gut?) aussieht. Und wir freuen uns, dass wir ihn lesen können.YAPD hat geschrieben: Mittwoch 28. Juli 2021, 22:13 und hab mich echt gefreut, dass alles so funktioniert.
Hi Narpfel,narpfel hat geschrieben: Donnerstag 29. Juli 2021, 00:18Benutze einen Autoformatter wie `black`, dann kannst du dich zusätzlich noch freuen, dass dein Code immer gleich (gut?) aussieht. Und wir freuen uns, dass wir ihn lesen können.YAPD hat geschrieben: Mittwoch 28. Juli 2021, 22:13 und hab mich echt gefreut, dass alles so funktioniert.
Und zum `dict.update`: Das wird leider in vielen Tutorials so gezeigt, und man kann als Anfänger natürlich nicht einschätzen, ob man da gerade guten Stil vermittelt bekommt. Schön wäre es mit `objects[module] = obj` (wobei man da potentiell auch noch die Namen verbessern könnte).
Hab ja immer geschrieben, ich bin lernfähigJeder fängt mal mit etwas an, und sollte sich freuen, dazuzulernen.
OK, du hast Recht, bei den Subs hab ich irgendwie nur 3 gemacht, daherOffensichtlich kann ich bis 3 zählen.
Ich verstehe, was du meinst, letztendlich ist es aber Geschmackssache.Das sind keine Objekte sondern alles lokale Variablen. Und bei lokalen Variablen
ist es klar, dass sie zu einer Methode gehören, die in der Klasse OM definiert ist.
Das OM_ sind also drei Buchstaben, die keinen Mehrwert bieten, sondern nur
das Lesen behindern.
Sorry, sei nicht böse, aber das verstehe ich nicht. Kannst du das ein bisschen erläutern. Ich weiß vonDu hast eine falsche Vorstellung davon, was Variablen in Python sind; das sind nur Referenzen
auf Objekte. Wenn man eine Referenz einer anderen Variable zuweist, werden keine Kopien erzeugt.
Strings sind unveränderlich, die können also gar nicht verändert werden.
Code: Alles auswählen
$x = "Test";
$y = $x;
$x = "Neu";
print $y;
Code: Alles auswählen
$x = "Test";
$y = $x;
$x .= "Neu";
print "$x / $y\n";
Code: Alles auswählen
import importlib
import pathlib
def load_plugins(path="application_plugins"):
path = pathlib.Path(path)
return {
imp.return_accepted_urls(): imp.scrape_url for imp in map(
lambda entry: importlib.import_module(f"{path}.{entry}"), filter(
lambda x: not x.startswith("_"), [entry.stem for entry in path.glob("*.py")]
)
)
}
Code: Alles auswählen
def load_plugins(path="application_plugins"):
path = pathlib.Path(path)
return {
module.return_accepted_urls(): module.scrape_url
for module in (
importlib.import_module(f"{path}.{module_path.stem}")
for module_path in path.glob("*.py")
if not module_path.name.startswith("_")
)
}