Seite 1 von 1

__init__py und Import

Verfasst: Sonntag 12. März 2023, 16:57
von Ernie1412
wie kann man von einem Unterordner aus die Main.py importieren ?

Code: Alles auswählen

# Ordnerstruktur:
# Datei_Info_Creator/
#     __init__.py
#     Main.py
#     DBPages/
#         __init__.py
#         DBPyQt_Darsteller.py
so hab ich die Ordnerstruktur, jetzt möchte ich von DBPyQt_Darsteller aus z.B. einen Eintrag in der QtableWidget von Main.py machen.
mit from ..Main import Haupt_Fenster gehts nicht.
Haupt_Fenster ist die Klasse

Re: __init__py und Import

Verfasst: Sonntag 12. März 2023, 17:04
von __blackjack__
Namenskonventionen und Rechtschreibung angepasst:

Code: Alles auswählen

from datei_info_creator.main import Hauptfenster
Wobei man sich fragen könnte was `main.py` hier bedeuten soll und wie sich das von `__init__.py` unterscheidet. Und auch warum etwas tiefer in der Hierarchie etwas aus einem Modul höher in der Hierarchie importiert. `main.py` wird ja nichts aus `DBPyQt_Darsteller.py` importieren (können), also wie kommt man da dann überhaupt hin?

Re: __init__py und Import

Verfasst: Sonntag 12. März 2023, 17:19
von Ernie1412
wieso kann Main.py nichts aus DBPyQt_Darsteller.py importieren ?
ich will nur die Datenbankabfragen Dateien in einem Unterordner packen. aus der Datenbankabfragen soll er dann z.B. in eine Tabelle schreiben, die in der Main.py ist

Re: __init__py und Import

Verfasst: Sonntag 12. März 2023, 17:49
von __blackjack__
@Ernie1412: ``import`` ist eine ausführbare Anweisung. Wenn die ausgeführt wird, dann muss das Modul aus dem man etwas importieren will zumindest soweit ausgeführt worden sein, dass das was man da importieren will schon definiert wurde. Das funktioniert also nicht immer und da wo es funktioniert ist es höllisch unübersichtlich. Darum macht man keine zirkulären Importe. Wenn sich zwei Module gegenseitig brauchen, dann sind die so eng verbandelt, dass es keine zwei Module sein sollten.

Aber die Beschreibung klingt dann auch gar nicht so wirklich nach importen, denn Du willst ja anscheinend gar nicht die Hauptfenster-*Klasse* aus `main.py` importieren, denn das würde ja bedeuten, dass da ein weiteres Hauptfenster erzeugt werden soll, sondern das Hauptfenster-Exemplar soll mit Daten bestückt werden. Dazu würde man einfach bei einem Aufruf das Hauptfenster-Exemplar übergeben.

Re: __init__py und Import

Verfasst: Sonntag 12. März 2023, 18:06
von Ernie1412
"Dazu würde man einfach bei einem Aufruf das Hauptfenster-Exemplar übergeben." wie soll sowas z.b. aussehen ?

Re: __init__py und Import

Verfasst: Sonntag 12. März 2023, 19:03
von sparrow
@Ernie1412: Erneut der Hinweis auf die Namenskonventionen: Namen schreibt man in Python klein_mit_unterstrich. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und die Namen von Klassen (PascalCase). PyQt/PySide weichen hiervon ab, weil die Bibliothek nicht in Python geschrieben ist. Deshalb kann man hier in den Klassen entsprechend abweichen. Das ist aber kein Grund eine Datei Main.py statt main.py zu nennen. DBPages sollte wohl auch anders heißen. Wobei ich mich frage, welche Seiten die Deutsche Bahn wohl hat. Und DBPyQt_Darsteller.py macht die Sache nicht besser. Vom Denglish in den Benennungen ganz abgesehen.

Wenn du so programmiet hast, wie man das tun sollte, nämlich ohne globale Variablen (auf Modulebene, also uneingerückt, stehen nur die Definition von Funktionen, Klassen, Konstanten, Importe und der if __name__ Einstigespnkt), sollte dir klar sein, dass das was du vor hast gar keinen Sinn macht. Es gibt in der main.py gar kein Objekt, dass du von irgend einem Modul erreichen kannst.
Üblich wäre dorthin, wo in in ein GUI-Objekt geschrieben werden soll, die Instanz des GUI-Objekts zu übergeben.

Re: __init__py und Import

Verfasst: Sonntag 12. März 2023, 19:24
von Ernie1412
man braucht ja garkein main import, das geht ja auch so:

Code: Alles auswählen

class DB_WebSide:
    """
        Destrukter zum freigeben
    """
    def __init__(self,Haupt_Fenster): 
        self.Main = Haupt_Fenster
mit self.Main.Qlabel,setText("bla") kann ich ganz einfach zugreifen.
@sparrow:
ich mache das hier als Hobby, denke nicht das ich damit noch jemals Geld verdienen werde :D. Wenn ich manch GROSSschreibungen der Deutlichkeit besser klarkomme, warum sollte ich das nicht machen ? Nur weil man dann sieht das ich "Anfänger" bin. Das ist mir echt so wumpe :mrgreen:
Manches wie globale variablen GROSS, variablen deutlicher benennen, sowas seh ich ja alles ein, aber alles ins Kleinste nach "Vorschrift" zu machen , sogar im Hobbybereich ? Ist das nicht typisch DEUTSCH ??

Re: __init__py und Import

Verfasst: Sonntag 12. März 2023, 19:36
von sparrow
Dass das so geht, haben dir ja auch zwei Leute hier gesagt.

Ne, das ist nicht typisch deutsch. Das Dokument, das du suchst, heißt PEP-8 und ist - oh Wunder - gar nicht in deutsch geschrieben. Keine Ahnung, wie du darauf kommst.
Das Problem mit deiner eigenen Interpretation der Konvention ist nicht, dass ich dich dann für einen Anfänger halte. Ich halte dich für jemanden, der Konventionen ignoriert, die jedem anderen, der sich deinen Code anschaut, hilft ihn zu verstehen. Und wenn du da dein eigenes Ding machst, ist das kein Problem. Das hat dann nur zur Folge, dass ich mir deinen Code nicht anschaue, weil ich keine Lust habe deine eigene Intpretation von "Deutlichkeit" auseinander zu fummeln.
Und ich verstehe ehrlich gesagt auch nicht, warum du ständig versuchst, Ratschläge damit zu blocken, dass du dich dahinter versteckst, dass du Dinge als Hobby tust. Ist das irgendwie typisch DEUTSCH?

Re: __init__py und Import

Verfasst: Sonntag 12. März 2023, 19:48
von Ernie1412
ich hab ne Idee, ich erstell ein kleines Programm, das mir den code bei variablen kleinschreibt. (text.lower()). Danach kriege ich sicherlich hier Top Antworten von Professionellen Users :D

Re: __init__py und Import

Verfasst: Sonntag 12. März 2023, 20:14
von __blackjack__
@Ernie1412: Ich dachte bis zum vorletzten Beitrag das `Haupt_Fenster` eine Klasse ist, denn *so* schreibt man Klassennamen. Jeder Python-Programmierer der das liest, geht von einer Klasse aus. Selbst C++-Programmierer, auch wenn dort meistens die Namenskonventionen gelten denen Qt folgt, denn PascalCase ist auch dort für Klassennamen vorgesehen und nicht für Objekte.

Die Schreibweise ist nicht einfach so eine Vorschrift, sie transportiert Information. Namenskonventionen erleichtern die Kommunikation und verhindern Fehler. So ziemlich jedes Softwareprojekt hat die und bei vielen Programmiersprachen gibt es da mindestens deutliche Empfehlungen von den Sprachentwicklern selbst. Bei manchen Programmiersprachen ist Gross-/Kleinschreibung sogar Teil der Syntax, da bekommt man tatsächlich einen Syntaxfehler wenn man beispielsweise den Namen eines Datentypen nicht mit einem Grossbuchstaben beginnt.

Hobbyprojekt oder nicht ist nicht das entscheidende. Du kannst sowohl Hobbyprojekte als auch professionelle Projekte mit Namen machen wie Du lustig bist — solange Du das keinem anderen zeigst, der das dann lesen und verstehen muss. Oder gar nur Bruchstücke oder Namen in Prosatext, wo man nicht einmal die Chance hat im Code zu sehen, dass der Name sich nicht an die Konventionen hält, und man dann falsche Annahmen trifft. Ohne weitere Informationen muss `Haupt_Fenster` eine Klasse sein a) wegen der Schreibweise und b) weil Du es aus einem Modul importieren wolltest. Wenn das keine Klasse ist, dann sind das ja schon zwei Fehler die man hätte erraten müssen.

Alle IDEs und die meisten Editoren mit Plugins für Python-Entwicklung markieren solche falschen Namen auch als Fehler oder Warnungen. Diese ganze Software wäre dann wohl auch ”typisch Deutsch”.

Re: __init__py und Import

Verfasst: Montag 13. März 2023, 12:50
von __deets__
Ernie1412 hat geschrieben: Sonntag 12. März 2023, 19:48 ich hab ne Idee, ich erstell ein kleines Programm, das mir den code bei variablen kleinschreibt. (text.lower()). Danach kriege ich sicherlich hier Top Antworten von Professionellen Users :D
Gibt es schon, nennt sich "Linter", wie zB black, und ist eigentlich automatisch aktiv in der genutzten Programmierumgebung. Aber je nach persoenlicher Borniertheit kann man das natuerlich auch deaktivieren :roll: