Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: Hans-Peter Jansen Newsgroups: de.comp.lang.python Subject: =?utf-8?q?=5BPython-de=5D_Re=3A_Code_Style_Review?= Date: Wed, 30 Nov 2022 15:52:59 +0100 Lines: 128 Message-ID: <6509182.4vTCxPXJkl@xrated> References: <25b8d1d4-d6e2-22ee-4bed-ec76227fa65d@sschwarzer.net> Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable X-Trace: news.uni-berlin.de qz4+/nT2G53YuZ19McEfjQCVrQIXVAsyGNLWGPfOPMrA== Authentication-Results: mail.python.org; dkim=none reason="no signature"; dkim-adsp=none (unprotected policy); dkim-atps=neutral X-Virus-Scanned: amavisd at 'smile.earth' In-Reply-To: <25b8d1d4-d6e2-22ee-4bed-ec76227fa65d@sschwarzer.net> X-Provags-ID: V03:K1:LF7QOSbbedrUeEfetJPpG+KVbE4xZegCeA6BtR3yP6VHYfFvwzj yJOjGWidnLH6z905lx4RUJPE3KqaT8iPDEhEqFJGe8uzQsBEMKJTZMBGd/fbXwH7fmeORCu wjfKU3hsuqBBPqrtkCd+Cg4iwTvFol4quZ3rfLojfk14Ry/f+9G3zuSBvhI+eGjCT7efpBW Gv+7IkrE5oMpgur1MEg+A== X-Spam-Flag: NO X-UI-Out-Filterresults: notjunk:1;V03:K0:Y1TF07QtjHc=:h6dmm7PxUPvfiSHQlDxi56 maVhzrYWl0sLIwL+LWUS+a+YyRNZ4DPquAC+VLL2EufRn9HVkqZep0OgIqHUXjCfvfHzpuD7J Di9wtXC15qnLKYb4ny4vfm2gIa2OJq6PUAgRo1GbxzjqULX6Unn8tgPItJkv2nHbRdAA6qxGX 7+iKF+ipJTltnZguVX+tPuaRHbBu5ppxvXgEBk0iCzXtjDvAOp+pZ3H7yfDunVlruh9/LLBgF +h83jUQb0VAT+12EZn49L0UmW4YrUshKONU27SfoPPH/qCqTJBI100hBH0URB48h1YMw75knF sp4SfHj85vhFb9Hf2YXHvsBMLB/almkN32FBnNpjf7X4qot6VC4A3wwSpm1dcGKQc4OEs2+Wu XMkgubnid/N7bASKI9/B8vS3xM6VhvN4sGuUbkRPDBRj0WqYxoA3NwOMmEhWJ5W6R3teZua18 y9s7zLC33pc9uoBcDVtutKc4cRSTCkJgCIkEqli+1W+JQ3/N+ehsjVF/LO9gjmZIe6L3WJbq7 wTttoQHWcZqCVIlt5bj3qHQwBs+5FncKAyBQWURhFmzG5JCZjRAh0AutHRuqAIXYz5C93/tgW znFNky8XvoQZJdVN4tdB19Hsa1MHRFGk8u72XunjPZNJEeW0Z85DnMY/ODTcRt8RrJy5P8Ma9 dfuU75TTDOj4YRUcI5JisFG2zMw764QZXDzA63NUU9rk0qSU2Wb7QjWEil2GXRd9G7d4tc+xR TCw6iKAdyqz51Er9UUdLOH6JWQv3MDDx9oqrthLGkEugGynW0TE2x+D14Ck77ADWfLOVru5i9 rdKv2SE Message-ID-Hash: OI2KRTCOCRKEG4RWY5SZ5CAHX2SIRF5K X-Message-ID-Hash: OI2KRTCOCRKEG4RWY5SZ5CAHX2SIRF5K X-MailFrom: hpj@urpla.net X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-python-de.python.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.7 Precedence: list List-Id: Die Deutsche Python Mailingliste Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Xref: csiph.com de.comp.lang.python:5881 Am Dienstag, 29. November 2022, 18:18:38 CET schrieb Stefan Schwarzer: > Hallo Marc, >=20 > On 2022-11-28 16:19, Marc Haber wrote: >=20 > > ich wollte mich schon seit Jahren mal etwas ernsthafter mit python > > besch=E4ftigen und hier ist mein Erstlingswerk signifikanter L=E4nge. > > pylint hat nichts auszusetzen, an manchen Stellen habe ich pylint aber > > =FCberstimmt. > >=20 > > Ist da irgendetwas drin, was nicht pythonesk genug formuliert ist? > >=20 > > Laufen tut das Programm jedenfalls. > >=20 > > Ich w=FCrde mich =FCber Eure Kommentare freuen. >=20 >=20 > ich habe hier und da ein paar Anregungen. Wie immer gilt, > dass letztlich der Autor entscheidet, wie er/sie diese > Anregungen umsetzt. :-) +1 > Erst mal zum Thema der Konfigurations-Speicherung, was in > dem Diskussions-Thread auch aufgegriffen wurde. Da in Python > Module und Klassen nat=FCrliche Singletons sind, w=E4re mein > Vorschlag, die Konfigurations-Daten in einer Klasse zu > speichern, also >=20 > ``` > class config: >=20 > # Listener IP address and port of MQTT server. > ip_address =3D None > port =3D None >=20 > # If `True`, print debugging output. > debug =3D False >=20 > ... > ``` >=20 > Du kannst einfach von =FCberall aus dem Modul auf das > `config`-Objekt zugreifen und brauchst auch kein `global`. > Die Klasse wird nie instanziiert, sondern nur als Namespace > benutzt. Yep, dem kann ich mich nur anschlie=DFen, und ich praktiziere diese Methode= seit=20 Jahrzehnten. Bei mir hei=DFt diese Klasse , da es mit h=E4uf= ig zu=20 =DCberschneidungen von anderen Funktionalit=E4ten kommt (z.B. config files). Grunds=E4tzlich gilt es dabei abzuw=E4gen, ob Du diese Werte * direkt wie globals verwendest -> f=FCr skriptnahe Routinen * deinen Funktionen/Methoden gpar als Parameter =FCbergibst -> skriptnahe Funktionen/Instanzen, die viele der Werte brauchen * die Konfigurationswerte einzeln =FCbergibst -> f=FCr universell wiederverwendbare Funktionen/Klassen/Methoden Vorab, ich erhebe nicht den Anspruch, irgendwie ausgesprochen pythonistisch= zu=20 sein, und setze in manchen Bereichen ganz bewusst oldschool-Ans=E4tze ein (= z.B.=20 getopt). Komme von einem systemnahen Assembler und C-Umfeld, und habe mit=20 Python im letzten Jahrtausend angefangen. Seitdem nutze ich es =FCberall, w= o es=20 die Wahl gibt, als =FCberaus n=FCtzliches, universelles Werkzeug, dass imme= r noch=20 Spa=DF macht! Letzteres ist eines der wichtigsten Aspekte f=FCr die Beliebt= heit=20 der Sprache, die nicht in irgendwelchen strategischen Charts ihren Einstieg= in=20 Industrie-Projekte gefunden hat (wie beispielsweise Java). Zu dem schon Gesagten m=F6chte ich noch erg=E4nzen: Aus Gr=FCnden der Flexibilit=E4t verwende ich f=FCr einfache Skripte folgen= des=20 Muster: def main(argv =3D None): """Command line interface and console script entry point.""" if argv is None: argv =3D sys.argv[1:] [...] return 0 if __name__ =3D=3D '__main__': sys.exit(main()) So kannst Du den Funktionsumfang des Skripts direkt, von anderen Modulen un= d=20 auch mit setuptools benutzen. Die --help Ausgabe findet sich in meinen Skripten meistens im __doc__ Berei= ch=20 des Hauptmoduls, wie Du auch schon damit angefangen hast. So habe ich auch = die=20 Dokumentation da, wo ich sie *will*. Neben vielen Vorteilen hat das aber au= ch=20 den Nachteil, Kommandozeilen Optionen nicht an einer Stelle fokussiert=20 abzufr=FChst=FCcken. Das funktioniert gut bis zu einer gewissen Gr=F6=DFe d= es=20 Projekts.=20 Wie das in echt aussieht, kannst Du Dir ja mal hier anschauen: https://github.com/frispete/vpndnshelper/blob/main/vpndnshelper.py Vielleicht findest Du da auch noch die eine oder andere Anregung. Da Du dic= h=20 scheinbar auch in einem unixoiden Umfeld bewegst, k=F6nnten dich die signal= und=20 exception Behandlungen der main Funktion interessieren. Dieses Skript l=E4u= ft=20 =FCbrigens =FCblicherweise als systemd Dienst, hat aber noch nie einen Lint= er=20 gesehen (und ja, das sollte ich auch mal tun..). Cheers, Pete =2D- Life without chameleons is possible, but pointless.