Zugriff auf Modul welches bereits aktiv ist

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.
BlackJack

@harryberlin: „Klatsche“ klingt ein bisschen hart. Sieh's als konstruktive Kritik. :-)

Es gibt mehrere Werkzeuge, die Python-Code statisch analysieren, oder es zumindest versuchen. Das klappt für so einfache Sachen wie die Namensschreibweisen oder überflüssige ``pass``-Anweisungen sehr gut (wobei man das natürlich auch ohne ein Werkzeug leicht sehen kann wenn man den Quelltext durchliest), und für Sachen die mit Attributen und Vererbung zu tun haben, so gut wie es eben bei einer dynamisch typisierten Programmiersprache geht. Die verbreitetsten Werkzeuge dürften `pep8`, `pyflakes`, und `pylint` sein. In vernünftigen™ Editoren und IDEs kann man so etwas auch integrieren, so dass man auf Knopfdruck oder automatisch beim Speichern einen Analyselauf anstossen kann, und das Ergebnis irgendwie sinnvoll präsentiert wird.

Semantische Sachen wie `start()` in der `Thread.__init__()`, die falsche Verwendung von Sockets, oder irreführende Namen weil deren Bedeutung nicht zu dem passt wofür sie stehen, kann der Rechner nicht automatisch finden. Wenn er so etwas könnte, währen wir wahrscheinlich nicht weit von Rechnern entfernt die sich selber programmieren. Da lauert dann der Terminator um die Ecke. :-D

Beruflich programmiere ich viel. Welch eine Überraschung. :-)
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

zukünftig wird aus dem script zwei. das war der hintergrund, zwischen modulen zu arbeiten.
deswegen adresse und port direkt in der funktion.
woran kann man variablen und konstanten erkennen?

welchen zweck hat jetzt das closing?

die client klasse habe ich wie gesagt, weil mir nahe gelegt wurde ich soll es so machen. lässt sich später auch mal einfacher importieren.

noch ne Verständnisfrage, weil ich ständig module, functionen und methoden lese:
wie definiert ihr das?

ebenso bei argumenten und eigenschaften.
empty Sig
BlackJack

@harryberlin: Variablen sind veränderbar, also variabel, und Konstanten bleiben immer gleich, also konstant. Variablen haben auf Modulebene nichts zu suchen und Konstanten werden per Konvention komplett in Grossbuchstaben geschrieben, damit man beim Lesen weiss das sich der Wert nicht ändert.

Was ist an der Dokumentation zu `contextlib.closing()` denn konkret unklar?

Bei der Client-Klasse würde ich eher nahelegen es *nicht* so zu machen, eben weil es semantisch keine Klasse ist.

Module, Funktionen, Methoden, und Argumente definieren wir so wie Python das tut. Wobei Funktionen, Methoden, und Argumente auch generell Begriffe aus der Programmierung sind und von sehr vielen Programmiersprachen gleich oder sehr ähnlich definiert werden. Das sollte eigentlich alles in einem Python-Tutorial oder -Buch stehen. Allgemein hilft Wikipedia auch oft was Programmierbegriffe angeht. Kurze Definitionen zu den Begriffen aus Python-Sicht finden sich in der Python-Dokumentation im Glossar.

Eigenschaften ist ein Begriff der ein bisschen mehrdeutig ist. Zum einen gibt es die ganz normale Bedeutung des Wortes im Deutschen. Und dann wird der Begriff auch für das gebraucht was man in Python mit `property()` erstellt.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

komisch, irgendwie reden wir immer aneinander vorbei.

1. d.h. sobald ein name in großbuchenstaben definiert ist, dann gilt es für python als konstante deklariert?

2. irgendwas muss dich doch dazu bewegt haben, "closing" rein zu nehmen. dass ich mir die manual dazu durchlese, kann ich mir nicht vorstellen.
geht damit etwas besser als zuvor?

3. Das Nutzen von Klassen hat mir BJ1 aus'm Kodinerds Forum ans Herz gelegt. Kennste bestimmt ;)

4. Zu den Definitionen aus meiner Sicht:
Modul: das Python File, was Klassen, Funktionen, Konstanten, Variablen enthalten kann. Sprich auch importiert werden kann.
Funktionen: Methode, Function, wobei ich auch schon gelesen hab, dass functionen als Objekt betitelt wurden in Bezug auf OOP.
Eigenschaften: Variablen oder Konstanten innerhalb Klassen.
Argumente: werden für Funktionen übergeben.
Property: Ok wieder was neues, muss ich mich mal belesen.
Widersprüchliches oder Richtigstellung bitte dazu schreiben, sollte ich falsches Verständnis haben.
empty Sig
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

harryberlin hat geschrieben:1. d.h. sobald ein name in großbuchenstaben definiert ist, dann gilt es für python als konstante deklariert?
Nein, er gilt für den Programmierer als Konstante. Dem Python ist das wurst, aber wenn ich als Programmierer einen solchen Namen im Pythoncode sehe, erwarte ich, dass er als Konstante verwendet wird, qua Konvention. In Python ist sehr vieles reine Konvention. Mehr dazu in PEP8.
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@harryberlin: Ad 1. Namen komplett in Grossbuchstaben gelten per Konvention für den Leser als Konstanten. Python macht diesen Unterschied nicht.

Ad 2. Entweder habe ich mir die Dokumentation dazu durchgelesen weil es in den Neuerungen bei der Python-Version gelistet war, oder ich habe es irgendwo gesehen und wollte wissen was das macht und habe mir daraufhin die Dokumentation dazu durchgelesen. Das weiss ich heute nicht mehr so genau. Bei der ``with``-Anweisung war es auf jeden Fall letzteres: Ich habe mir das PEP dazu durchgelesen als das in die Sprache aufgenommen wurde. Wenn Du Dir nicht vorstellen kannst Dokumentation zu lesen, kann ich mir nicht vorstellen wie man so sinnvoll und zügig eine Sprache oder etwas anderes lernen soll‽ In der Dokumentation steht wozu ein ``with closing(…):`` äquivalent ist, und daraus sollte dann entweder klar werden was daran besser ist, oder man hat weitere Anhaltspunkte (``try``/``finally``) die man sich erarbeiten sollte um Python zu lernen/zu verstehen.

Ad 3. Kenne das Kodnerds-Forum nicht. Klassen sind kein Selbstzweck, die sollten schon Sinn haben und nicht einfach nur mehr Komplexität in das Programm bringen, ohne das man davon einen Vorteil hat. Wir sind hier ja nicht bei Java. :-)

Ad 4. In Python ist alles was man an einen Namen binden kann ein Objekt, also jeder Wert. Auch Module, Klassen, und Funktionen sind Objekte/Werte.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

1. OK

2. klar les ich mir auch mal was durch.
mal ein kleines beispiel zum anfassen:
wenn du dein auto in der werkstatt hattest, und beim abholen hast du andere räder drauf. der werkstatt mann sagt dir nur, "geh zum KBA und hol dir die infos zu den rädern. vllt kommst ja dann drauf, wieso nun andere montiert sind". ist irgendwie wenig hilfreich.
wenn man sagt "damit kann man schneller fahren", dann ist das ne greifbare begründung.
und nein, ich möchte python nicht auswendig lernen, ich will es verstehen. bin eher praktisch gestrickt.

3. hehe, ich dachte echt BJ von BJ1 steht für BlackJack.
in meinen fall würde ich die "klasse" sogar einfacher finden, und nicht komplex. weil so ne einheitliche trennung vorhanden ist.

4. hui, das verkompliziert nun wieder ein wenig.
mal noch ne andere frage zu variablen und global. variablen soll man ja nicht per global holen, sondern mit ner funktion zurückgeben.
was ist denn schneller, die funktion oder das global?
empty Sig
BlackJack

@harryberlin: Ad 2. Gerade zum Verstehen musst Du doch nachlesen was etwas bestimmtes macht. Wenn Du das nur anwendest ohne es verstanden zu haben, gerade *dann* ist das doch einfach nur auswendig gelernt. Also um bei Deinem Beispiel zu bleiben: Wenn Du nur weisst das man mit den Rädern schneller fahren kann, weisst Du a) nicht warum, und b) nicht unter welchen Randbedingungen und unter welchen sie langsamer als die alten Räder sind, oder gar gefährlich werden können. Und bei PEPs erfährt man nicht nur was etwas bestimmtes macht, wie beispielsweise das ``with``-Konstrukt, sondern auch eine Begründung welche Vorteile das hat, denn so ein PEP muss ja Guido überzeugen, dass die Verbesserung wirklich eine Verbesserung darstellt und nicht einfach mit bereits vorhandenen Mitteln bewerkstelligt werden kann.

Ad 3. Die Klasse macht nichts was man nicht auch mit einer Funktion erreichen kann. Wie kann das dann einfacher sein?

Ad 4. Die Frage stellt sich nicht, beziehungsweise die Antwort ist irrelevant. Da man ``global`` nicht verwendet, ist es egal ob das schneller wäre oder nicht.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

2. es geht nicht ums with, sondern ums closing oder makefile. du für mich musst doch nen grund gehabt haben, den code so umzuschreiben. wenn du mich nur auf docu verweisen willst, da du den grund für dich behalten möchtest. ok, dann behalt es für dich.
gibts zum PEP auch gute deutsche Seiten? jetzt mal google.de außen vor :D

4. warum ist global dann in der docu zu finden, wenn man es nicht braucht?
unter gewissen umständen stellt sich schon die frage, was schneller ist. z.b. wenn man auf eine anfrage innerhalb weniger millisekunden antworten muss.
mit einer funktion wären wir dann wieder bei 3.(einer klasse), damit man den zustand der variable in einer eigenschaft halten kann.
empty Sig
BlackJack

@harryberlin: Ad 2. Doch es geht um das ``with``, denn dafür ist das `contextlib`-Modul ja da und `closing()` ohne ``with`` macht nicht viel Sinn. `makefile()` weil Deine `recv()`-Verwendung fehlerhaft war und es mehr Arbeit gemacht hätte sich das was `makefile()` macht von Hand selber zu programmieren.

Ich behalte den Grund nicht für mich, ich habe ja verraten wo man nachlesen kann. Ich könnte das jetzt hier nochmal in eigenen Worten abtippen, aber mal ehrlich, Du kannst das entweder dort nachlesen oder hier. Es ist in beiden Fällen Arbeit für Dich. Aber nur in einem Fall ist es Arbeit für mich, wo ich nicht wirklich einsehe warum ich Dir hier was hinschreiben soll was woanders schon steht.

Ad 4. Gute Frage, ich würde ``global`` aus der Dokumentation herausnehmen, am besten sogar aus der Sprache, oder in der Dokumentation mindestens mal ganz deutlich schreiben das man das nicht verwenden soll. Ausser in den ganz wenigen Fällen in denen das Sinn macht. Und wenn man so einen Fall gefunden hat, dann sollte man es nicht verwenden, weil man ziemlich sicher doch keinen Fall dafür hat. Das ist so ein bisschen die Frage danach warum es Atombomben gibt, wenn doch jeder der bei Verstand ist, die nicht einsetzt.

Falls sich tatsächlich eine Geschwindigkeitsfrage daran festmachen liesse, dann ist das kein Grund für ``global`` sondern ein Grund eine andere Programmiersprache zu verwenden, welche die Anforderung mit sauberem Quelltext erfüllen kann.
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

2. Hmm ok. Ich hatte keinen Fehler. Das script lief ohne closing oder makefile mit gewünschter rückgabe durch.

4. d.h. der Umweg mit einer klasse wäre richtig?
empty Sig
BlackJack

@harryberlin: Ad 2. Das etwas ohne Fehler durchläuft heisst ja nicht das der Code fehlerfrei ist, sondern nur das sie bei den bisherigen Programmläufen noch keine Folgen gezeigt haben (oder man die übersehen hat).

Ad 4. Was heisst Umweg? Wenn es ein Umweg ist, dann ist es ja nicht der direkte Weg. Den sollte man nehmen. Andererseits aber auch keine unsauberen Abkürzungen wie ``global``. Also ist das ein Umweg oder nicht?
harryberlin
User
Beiträge: 227
Registriert: Donnerstag 17. Dezember 2015, 12:17

2. ich wüsste nicht was falsch ist. ob es mit with, closing und makefile richtiger ist, geht aus der doku nicht hervor.

4. hier verhält es sich genauso. ich kenne nur global oder in einer klasse ne eigenschaft setzen. wonach ich suchen müsste, um nen direkteren weg zu realisieren, kein plan.
empty Sig
BlackJack

@harryberlin: Der Vorteil von ``with`` und `closing()` geht aus dem PEP für ``with`` hervor. Dort dient es als Beispiel (und heisst noch `opening()`). Das Deine Verwendung von `recv()` falsch ist und warum sie das ist, habe ich Dir bereits geschrieben. Du musst natürlich nicht `makefile()` verwenden sondern kannst auch mit `recv()` fehlerfreien Code schreiben, nur ist das eben aufwändiger, weil Du das nachprogrammieren musst, was Dateiobjekte in Python bereits liefern.
Antworten