Rocksolid Light

groups  faq  privacy  How to post  login

Message-ID:  

Kindness is a language which the deaf can hear and the blind can read. -- Mark Twain


rocksolid / de.comp.lang.python / [Python-de] "Export" an Modul möglich?

SubjectAuthor
* [Python-de] "Export" an Modul möglich?Ulrich Goebel
+- [Python-de] Re: "Export" an Modul möglich?jochen
+- [Python-de] Re: "Export" an Modul möglich?c.buhtz
`- Re: [Python-de] "Export" an Modul möglich?Peter J. Holzer

1
Subject: [Python-de] "Export" an Modul möglich?
From: Ulrich Goebel
Newsgroups: de.comp.lang.python
Date: Mon, 10 Jul 2023 21:45 UTC
Path: i2pn2.org!i2pn.org!news.swapon.de!fu-berlin.de!uni-berlin.de!not-for-mail
From: ml...@fam-goebel.de (Ulrich Goebel)
Newsgroups: de.comp.lang.python
Subject: [Python-de] "Export" an Modul möglich?
Date: Mon, 10 Jul 2023 23:45:51 +0200
Lines: 136
Message-ID: <6f2f38bb-6c0a-7bc6-5c9e-76517eda8601@fam-goebel.de>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
X-Trace: news.uni-berlin.de yfZte9yygM04iEbG3cIGkQLJYsf5b4cEFrrwolEHwk3Q==
Cancel-Lock: sha1:0ReUcBVrD+8qq/hKNkWkknbwQ6Y= sha256:XuVvwKjnfYQ6xCHJ0QaXNNPwVorpu614o9tHPm8ajGQ=
Authentication-Results: mail.python.org; dkim=none reason="no signature";
dkim-adsp=none (unprotected policy); dkim-atps=neutral
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101
Thunderbird/102.11.0
Content-Language: de-DE
X-Authenticated-Sender: ml@fam-goebel.de
X-Virus-Scanned: Clear (ClamAV 0.103.8/26965/Mon Jul 10 09:29:40 2023)
Message-ID-Hash: 2VAX7MFR4ID52KKNDXGLWDDEWF7NEXHC
X-Message-ID-Hash: 2VAX7MFR4ID52KKNDXGLWDDEWF7NEXHC
X-MailFrom: ml@fam-goebel.de
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.9b1
Precedence: list
List-Id: Die Deutsche Python Mailingliste <python-de.python.org>
Archived-At: <https://mail.python.org/archives/list/python-de@python.org/message/2VAX7MFR4ID52KKNDXGLWDDEWF7NEXHC/>
List-Archive: <https://mail.python.org/archives/list/python-de@python.org/>
List-Help: <mailto:python-de-request@python.org?subject=help>
List-Owner: <mailto:python-de-owner@python.org>
List-Post: <mailto:python-de@python.org>
List-Subscribe: <mailto:python-de-join@python.org>
List-Unsubscribe: <mailto:python-de-leave@python.org>
View all headers

Guten Abend,

in einer Datenbank-Anwendung, die später SQLite, PostgreSQL und evt.
weitere Enginges bedienen soll, habe ich folgende Situation:

Modell.py definiert mir Objekte, die auf einer SQL-DB operieren. Dieses
Modul möchte ich auch für andere DB-Anwendungen nutzen können. Daher
kennt Modell.py die tatsächliche DB nicht.

Modelle.py definiert anwendungsspezifisch Objekte, die die jeweilige
SQL-Tabellenstruktur abbilden. Grundlage dafür sind die (generischen)
Objekte aus Modell.py

Tools.py definiert weitere anwendungsspezifische Operationen auf der DB,
typischerweise SELECT Anwendungen für Auswertungen.

Main.py ist das Hauptprogramm. Das Hauptprogramm bekommt vom Benutzer
z.B. auch Benutzernamen und Passwort für den DB-Zugang.

Mein Problem: Wie bekommen Modell.py und Tools.py einen gültigen
DB-Konnektor? Möglichst sogar den selben?

Folgenden Versuch habe ich gemacht:

In Modell.py gibt es eine
Klasse DB_Konnektor mit einem Zustand DB_Konnektor.DB und einer Methode
DB_Konnektor.Init(Zugangsdaten); letztere erzeugt den DB_Konnektor und
speichert ihn in dem Klassenzustand DB_Konnektor.DB
Außerdem gibt es in Modell.py die
Funktion DB(), die einfach den Zustand DB_Konnektor.DB zurück gibt.

In Main.py, Modelle.py und Tools.py kann ich nun aus Modell.py den
DB_Konnektor und die Funktion DB() importieren. Und tatsächlich scheint
der DB_Konnektor nach Aufruf von DB_Konnektor.Init(Zugangsdaten)
sichtbar zu sein.

Den Code der Python-Files habe ich unten wiedergegeben.

Ist das ein gutes, "pythonisches" Vorgehen? Oder gibt es eine elegantere
Möglichkeit?

Unschön bleibt aus meiner Sicht, dass der DB-Konnektor nur über eine
Funktion zugänglich ist, also DB(). Schöner wäre DB, also eine "Zustand
des Moduls" - aber das gibt es wohl nicht? So sieht die Syntax später
z.B. so aus:
Cur = DB().cursor()
DB().commit()
Schöner wäre:
Cur = DB.Cursor()
DB.commit()

Wäre es naheliegend, die Klasse DB_Konnektor von den Konnektor-Klassen
der implementierten Schnittstellen erben zu lassen? Also etwa:

class DB_Konnektor(sqlite3.Connector, psycopg2.extensions.connection)
def __init__(Typ, ...):
if Typ == 'SQLite':
sqlite3.Connector.__init__(...)
elif Typ == 'PostgreSQL':
psycopg2.extensions.connection.__init__(...)
...

Vielen Dank für Hilfe oder Hinweise!
Gruß Ulrich

Hier mein vorläufiger Code:

====== Modell.py ======
class DB_Konnektor():
DB = "DB Prototyp (unbrauchbar)"

def Init(DB_Name):
DB_Konnektor.DB = DB_Name

def DB():
return DB_Konnektor.DB

class Modell():
def DB(self):
print('Aus Sicht von Modell.Modell ist DB: {}'.format(DB()))
return DB_Konnektor.DB

### Die Klasse Modell ist in Wirklichkeit sehr umfangreich.
### Sie greift auf den DB-Konnektor zurück.
###
### Hier folgen weitere Objekte, die auch auf den DB-Konnektor
### zurückgreifen.

====== Modelle.py ======
from Modell import *

### Hier folgen die Klassen, die Datenbank-Tabellen abbilden.
### Grundlage dafür sind die in Test_Modell
### definierten Objekte.

====== Tools.py ======
from Modelle import *

def Tools():
print('Aus Sicht von Tools ist DB: {}'.format(DB()))

### Hier folgen eine Reihe von Objekten, die auf den
### DB-Konnektor zurückgreifen.

=== Main.py ===
from Modell import DB
from Modelle import *
from Tools import *

M = Modell()

### Vor dem Aufruf von DB_Konnektor.Init() sieht es so aus:
print('Aus Sicht des Hauptprogramms vor Init ist DB: {}'.format(DB()))
print('Aus Sicht des Hauptprogramms vor Init ist M.DB: {}'.format(M.DB()))
Tools()

### Aufruf von DB_Konnektor.Init(Zugangsdaten):
DB_Konnektor.Init("DB brauchbar.")

### Nach dem Aufruf von DB_Konnektor.Init(Zugangsdaten)
### sieht es so aus:
print('Aus Sicht des Hauptprogramms nach Init ist DB: {}'.format(DB()))
print('Aus Sicht des Hauptprogramms nach Init ist M.DB: {}'.format(M.DB()))
Tools()

--
Ulrich Goebel
Hainallee 40, 44139 Dortmund

Subject: [Python-de] Re: "Export" an Modul möglich?
From: joc...@wersdoerfer.de
Newsgroups: de.comp.lang.python
Date: Tue, 11 Jul 2023 05:58 UTC
References: 1
Path: i2pn2.org!i2pn.org!weretis.net!feeder8.news.weretis.net!fu-berlin.de!uni-berlin.de!not-for-mail
From: joc...@wersdoerfer.de
Newsgroups: de.comp.lang.python
Subject: [Python-de]_Re:_"Export"_an_Modul_möglich?
Date: Tue, 11 Jul 2023 07:58:08 +0200
Lines: 13
Message-ID: <9FC81C90-23AF-462E-BC2B-874F31D17595@wersdoerfer.de>
References: <6f2f38bb-6c0a-7bc6-5c9e-76517eda8601@fam-goebel.de>
Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3731.600.7\))
Content-Type: text/plain;
charset=utf-8
Content-Transfer-Encoding: base64
X-Trace: news.uni-berlin.de zCRpHpffc3GJ/TLdZSW9hQpFxNU1sRTuweoDAfCBw9oQ==
Cancel-Lock: sha1:OTosc2JIHjmv9ZOnvXTiA7K34Ak= sha256:YM9h81uibwl3nzgEH688FGoGsiC5zVpNNluTsFMLn8o=
Authentication-Results: mail.python.org; dkim=pass
reason="2048-bit key; unprotected key"
header.d=wersdoerfer-de.20221208.gappssmtp.com header.i=@wersdoerfer-de.20221208.gappssmtp.com
header.b=xCJgl29Y; dkim-adsp=none (unprotected policy);
dkim-atps=neutral
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=wersdoerfer-de.20221208.gappssmtp.com; s=20221208; t=1689055100; x=1691647100;
h=references:to:cc:in-reply-to:date:subject:mime-version:message-id
:from:from:to:cc:subject:date:message-id:reply-to;
bh=Qs5Hk0IbSeiNXeFEJs+HsM6TmOdrlc1g3SDlWHSNZPs=;
b=xCJgl29YK0PUT/RIQl6gXNVsFQrgBeS1k4H4Rr3JstBzLdnXTr3CIXf41sKhCPTSAN
sEhBsjkwXt6k0KXQRy7kusJVmQLhKjPxb/hEL/0vM839KmoEE56wYjoRGFQ7UW3Litoo
kQ+fzytG7/KgFYt94IpgzwTIvlgbZ9xp6FliJEs50YF/O4/PmFQqDLK5DSc3oVYK4x4C
fIlEmfubZH2t5JIpfc+O18X+y9iLCAQRQVWyOWBgX3eqlo7rjOhgoFi0Je+4z+n8oLq7
5rX76GQ23tf8OmeE4a9FEj012soiilgBukzN1DxmBKt+P4kqCqx8w3vyaUtpOCE7JdNF
Pdvw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=1e100.net; s=20221208; t=1689055100; x=1691647100;
h=references:to:cc:in-reply-to:date:subject:mime-version:message-id
:from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
bh=Qs5Hk0IbSeiNXeFEJs+HsM6TmOdrlc1g3SDlWHSNZPs=;
b=F46Rx8xcpUXr+IzCjxqU2inSOF8CsBy/L8EplJ/buWaz+ce6yxNskLkxfEeiEtxcGw
RPRMdtz++dhLoZ7SSkYqdxRCKBkkrg5fWhb/uTOplZDs1iRcgUoXVFIcTrljTBB6Kqka
KNPhKmxp9JtLUnBORl2tUX5WK5QA4beKl1UfPA6dgzpi0rr/WAfhe05lxB4GwZS4zu+g
9nBBre+TfUkYN26rzUcBe4U9c8cCiBpW0occJd5ygh/M7Allxwv5y2sB9EF+3wNtgaRS
xSuTVJFs7wxyp4YA6YtTgVSKlY5U2BR0i0XK3FIyp7TQEuYSDOhQM4ove/Y/4acrlct8
WVQA==
X-Gm-Message-State: ABy/qLZUoZyiW7ytfLE7khQ2oJlMwLZkV9NoEwwggBem7R2SbIb8WUaR
KBLI6PhXua38R4vIZ8/OED/3Ag==
X-Google-Smtp-Source: APBJJlGWkDYp2o1krLtSGEK/MNTmdko/sSVvy+s20MUg8dqZEGg7RnXscVEpPkr4nCPZP+XlrWHPQA==
X-Received: by 2002:a5d:4905:0:b0:314:311d:1b9 with SMTP id x5-20020a5d4905000000b00314311d01b9mr13219211wrq.47.1689055099323;
Mon, 10 Jul 2023 22:58:19 -0700 (PDT)
X-Google-Original-From: jochen-python@wersdoerfer.de
In-Reply-To: <6f2f38bb-6c0a-7bc6-5c9e-76517eda8601@fam-goebel.de>
X-Mailer: Apple Mail (2.3731.600.7)
X-MailFrom: jochen@wersdoerfer.de
X-Mailman-Rule-Hits: nonmember-moderation
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-python-de.python.org-0
Message-ID-Hash: HXDRNVPK75BIQ2H5P6GIUNFOZU7CPFBJ
X-Message-ID-Hash: HXDRNVPK75BIQ2H5P6GIUNFOZU7CPFBJ
X-Mailman-Approved-At: Tue, 11 Jul 2023 02:09:00 -0400
X-Content-Filtered-By: Mailman/MimeDel 3.3.9b1
X-Mailman-Version: 3.3.9b1
Precedence: list
List-Id: Die Deutsche Python Mailingliste <python-de.python.org>
Archived-At: <https://mail.python.org/archives/list/python-de@python.org/message/HXDRNVPK75BIQ2H5P6GIUNFOZU7CPFBJ/>
List-Archive: <https://mail.python.org/archives/list/python-de@python.org/>
List-Help: <mailto:python-de-request@python.org?subject=help>
List-Owner: <mailto:python-de-owner@python.org>
List-Post: <mailto:python-de@python.org>
List-Subscribe: <mailto:python-de-join@python.org>
List-Unsubscribe: <mailto:python-de-leave@python.org>
View all headers


> Am 10.07.2023 um 23:45 schrieb Ulrich Goebel <ml@fam-goebel.de>:
>
> Ist das ein gutes, "pythonisches" Vorgehen? Oder gibt es eine elegantere Möglichkeit?
Hmm, kennst du das Repository-Pattern schon? Das ist so der übliche Weg, wenn man
die Datenhaltung wegabstrahieren möchte:
https://www.cosmicpython.com/book/chapter_02_repository.html
> Unschön bleibt aus meiner Sicht, dass der DB-Konnektor nur über eine Funktion zugänglich ist, also DB(). Schöner wäre DB, also eine "Zustand des Moduls" - aber das gibt es wohl nicht? So
Klar, das geht auch. Aber Attribute von Modulen sind halt für alle gleich, d.h. wenn man das
ändern sollte, ändert man es für alle, die es benutzen.
Viele Grüße
Jochen

Subject: [Python-de] Re: "Export" an Modul möglich?
From: c.bu...@posteo.jp
Newsgroups: de.comp.lang.python
Date: Tue, 11 Jul 2023 07:28 UTC
References: 1
Path: i2pn2.org!i2pn.org!weretis.net!feeder8.news.weretis.net!fu-berlin.de!uni-berlin.de!not-for-mail
From: c.bu...@posteo.jp
Newsgroups: de.comp.lang.python
Subject: [Python-de]_Re:_"Export"_an_Modul_möglich?
Date: Tue, 11 Jul 2023 07:28:58 +0000
Lines: 29
Message-ID: <2f44e7310f0d5ad8eb17d8b7c3b740ab@posteo.de>
References: <6f2f38bb-6c0a-7bc6-5c9e-76517eda8601@fam-goebel.de>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8;
format=flowed
Content-Transfer-Encoding: quoted-printable
X-Trace: news.uni-berlin.de cxaVPKM9WBEbbbpQFkdeiQcHw7wxE9dSEBvQCwTjgOWw==
Cancel-Lock: sha1:HZVMiv7L78uX6Dx2/7GMF8eH5n4= sha256:OTB9mvzgUFIyLJpgemS549GF/zRL0sDOtCpEf1bxOik=
Authentication-Results: mail.python.org; dkim=pass
reason="2048-bit key; unprotected key"
header.d=posteo.jp header.i=@posteo.jp header.b=obuiYVBC;
dkim-adsp=pass; dkim-atps=neutral
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.jp; s=2017;
t=1689060539; bh=wdo+7PAZO05ulkvtbKwNO2c6Y6t9qWV3BJ+96HtHD+M=;
h=MIME-Version:Content-Transfer-Encoding:Date:From:To:Subject:
Message-ID:From;
b=obuiYVBCB5aR5QMLU2JkMp7Y3Yij9Te6XU7J0CMf1t6rkK30E3lkxkbXZ9iETbti+
qsQBzOOyr3ree0/1Xm1o61VyZKO5juXqqyD3wMV2kq/aKXtJrBYJctZa4Xm40DBY9x
r/AGw6vPDMGULgKoot2dGERoIPrXHzR68YV6SetvxNFcSem5vqqEmaRKPkvVc4l4t1
FGz0gb5IIBC3VUVIjHi+gN1ikUv6azIABaal7+ZPO+ld7xQrMtyXfQ/+JIgeOw6CkD
TUq7epy0sPZYD9tPQ1kzaZtPRQnyv6cjtXivxRGV14/MUywYa+eIKyIJpQz6lk/7as
P+qw+n2AmAnuA==
Mail-Followup-To: python-de@python.org
In-Reply-To: <6f2f38bb-6c0a-7bc6-5c9e-76517eda8601@fam-goebel.de>
Message-ID-Hash: 4WSTH336NEE7FWUU2STIRYRD36IW756K
X-Message-ID-Hash: 4WSTH336NEE7FWUU2STIRYRD36IW756K
X-MailFrom: c.buhtz@posteo.jp
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.9b1
Precedence: list
List-Id: Die Deutsche Python Mailingliste <python-de.python.org>
Archived-At: <https://mail.python.org/archives/list/python-de@python.org/message/4WSTH336NEE7FWUU2STIRYRD36IW756K/>
List-Archive: <https://mail.python.org/archives/list/python-de@python.org/>
List-Help: <mailto:python-de-request@python.org?subject=help>
List-Owner: <mailto:python-de-owner@python.org>
List-Post: <mailto:python-de@python.org>
List-Subscribe: <mailto:python-de-join@python.org>
List-Unsubscribe: <mailto:python-de-leave@python.org>
View all headers

Hallo Ulrich,

ich kenne deinen Anwendungsfall nicht, aber möchte eine Sache zu
bedenken geben, die ich aus meinen Anfangszeiten mitgenommen habe.

Datenbank sind ziemlich cool und so. Auf den ersten Blick erscheinen sie
meist als das Mittel der Wahl. Sie an eine Anwendung anzubinden ist aber
häufig sehr aufwendig und noch aufwendiger diese Anbindung zu warten.

Manchmal ist es sinnvoller vielleicht doch auf eine Datenhaltung ohne
Datenbank zurückzugreifen; Textdateien, JSON, CSV, Pickle-Files. Ein
bisschen Verwaltungs-Logik muss man dann selbst implementieren, aber
langfristig spart es viel Arbeit, weil man die ganze "Last"
(Abstraktionsschichten, Code-Wartung, Unittests, ...) die man sich mit
einer Datenbank dazu holt wegfällt.

Es ist eine Kosten-Nutzen-Rechnung.

Schöne Grüße
Christian

Am 10.07.2023 23:45 schrieb Ulrich Goebel:
> Guten Abend,
>
> in einer Datenbank-Anwendung, die später SQLite, PostgreSQL und evt.
> weitere Enginges bedienen soll, habe ich folgende Situation:

Subject: Re: [Python-de] "Export" an Modul möglich?
From: Peter J. Holzer
Newsgroups: de.comp.lang.python
Organization: LUGA
Date: Tue, 11 Jul 2023 10:59 UTC
References: 1
Path: i2pn2.org!i2pn.org!weretis.net!feeder8.news.weretis.net!newsfeed.xs3.de!callisto.xs3.de!tahina.priv.at!news.luga.at!.POSTED.83.218.180.76!not-for-mail
From: hjp-usen...@hjp.at (Peter J. Holzer)
Newsgroups: de.comp.lang.python
Subject: Re: [Python-de] "Export" an Modul möglich?
Date: Tue, 11 Jul 2023 12:59:23 +0200
Organization: LUGA
Message-ID: <slrnuaqdgb.cev.hjp-usenet3@trintignant.hjp.at>
References: <6f2f38bb-6c0a-7bc6-5c9e-76517eda8601@fam-goebel.de>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
Injection-Info: vinge.luga.at; posting-host="83.218.180.76";
logging-data="3392"; mail-complaints-to="usenet@vinge.luga.at"
User-Agent: slrn/1.0.3 (Linux)
View all headers

On 2023-07-10 21:45, Ulrich Goebel <ml@fam-goebel.de> wrote:
> Unschön bleibt aus meiner Sicht, dass der DB-Konnektor nur über eine
> Funktion zugänglich ist, also DB(). Schöner wäre DB, also eine "Zustand
> des Moduls" - aber das gibt es wohl nicht? So sieht die Syntax später
> z.B. so aus:
> Cur = DB().cursor()
> DB().commit()
> Schöner wäre:
> Cur = DB.Cursor()

Also einen Methodennamen, der mit einem Großbuchstaben beginnt, finde
ich nicht schöner, sondern ziemlich irritierend.

> DB.commit()

Oh, Du meinst das?

Geht natürlich genauso. Die Variable musst Du dann halt vorher
initialisieren und das Behandeln von Verbindungsabbrüchen wird auch
komplizierter. Aber wenn Du den Cursor schon hast, hast Du auch
eine Verbindung zur Connection:

Cur.connection.commit()

(Und "cur" würde ich auch mit kleinem c schreiben)

hp


rocksolid / de.comp.lang.python / [Python-de] "Export" an Modul möglich?

1
server_pubkey.txt

rocksolid light 0.9.12
clearnet tor