Seite 1 von 1

Klasse oder Dict, was am besten nehmen?

Verfasst: Dienstag 11. Juni 2013, 21:25
von friedduck
Hallo,

ich möchte in einem Projekt einen "wertespeicher" haben, der in mehreren Packages verfügbar sein soll.
Was soll ich am besten verwenden? Eine vorinitialisierte Klasse oder ein Dict verpackt in ein Modul?

Code: Alles auswählen

class Testklase(object):
  def __init__(self):
    self.wert1 = 'wert1'
    self.wert2 = 'wert2'

Code: Alles auswählen

def wertespeicher():
  meinwert = {'wert1':'wert1', 'wert2':'wert2'}
  return meinwert
und dann...

Code: Alles auswählen

from bla import Testklasse oder from bla import wertespeicher

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Dienstag 11. Juni 2013, 22:14
von BlackJack
@friedduck: Das kommt darauf an was Du am Ende damit vorhast. Falls das ein „globaler Wertespeicher” sein soll, dann würde ich zumindest hinterfragen ob das so gewollt/nötig ist.

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Dienstag 11. Juni 2013, 22:25
von friedduck
Hi Blackjack, du hast recht. es soll ein globaler Wertespeicher werden. Hast Du einen besseren Vorschlag für die Umsetzung? Die Werte kommen aus einer Datenbank.

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Dienstag 11. Juni 2013, 23:02
von BlackJack
@friedduck: Muss das denn wirklich global sein? Kann man die Daten nicht herum reichen? Oder jeweils von der DB abfragen? Was sind das für Daten?

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Mittwoch 12. Juni 2013, 07:28
von kbr
friedduck hat geschrieben:es soll ein globaler Wertespeicher werden
Erstelle eine Klasse und reiche Instanzen davon herum. Sollte das nicht ausreichen, ist der Programmentwurf sehr wahrscheinlich fragwürdig.

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Mittwoch 12. Juni 2013, 09:45
von friedduck
kbr hat geschrieben:
friedduck hat geschrieben:es soll ein globaler Wertespeicher werden
Erstelle eine Klasse und reiche Instanzen davon herum. Sollte das nicht ausreichen, ist der Programmentwurf sehr wahrscheinlich fragwürdig.
Das würde mir schon genügen. Wie kann ich das Bewerkstelligen, also die Instanzen rumreichen?

@Blackjack:
Bei den Daten handelt es sich um Einstellungen z.B von einem SMTP Server, IP Adresse, Port u.s.w. Die Wollte ich dann gleich beim Programmstart
irgendwo ablegen um dann im späteren Programmablauf darauf zugreifen zu können.

Wie würdest du denn das Problem angehen?

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Mittwoch 12. Juni 2013, 13:22
von BlackJack
@friedduck: Solche Daten könnte man in einem Modul ablegen oder in einer Konfigurationsdatei. Ich tendiere zum letzteren im JSON-Format. Die lädt man dann von der Hauptfunktion aus und übergibt die Werte an die Funktionen und Objekte in denen man sie benötigt.

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Mittwoch 12. Juni 2013, 13:38
von xeike
friedduck hat geschrieben:Bei den Daten handelt es sich um Einstellungen z.B von einem SMTP Server, IP Adresse, Port u.s.w.
Ich würde ein dict nehmen. Und folgendermaßen kannst du das dict rumreichen:

Code: Alles auswählen

einstellungen = {'ip':'127.0.0.1', 'server':'www.python-forum.de'}
>>> einstellungen
{'ip': '127.0.0.1', 'server': 'www.python-forum.de'}
>>> einstellungen['ip']
'127.0.0.1'
>>> def foo( meine_einstellungen ):
...   print( meine_einstellungen )
... 
>>> foo( einstellungen )
{'ip': '127.0.0.1', 'server': 'www.python-forum.de'}
Viele Grüße

Xe

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Mittwoch 12. Juni 2013, 13:52
von BlackJack
@xeike: Das ist IMHO unschön solange nicht wirklich alle Werte von `foo()` auch benötigt werden. Und dann wäre es lesbarer wenn die Funktionssignatur nicht nur aus so einem allgemeinen Argument `meine_einstellungen` bestehen würde.

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Mittwoch 12. Juni 2013, 16:11
von xeike
BlackJack hat geschrieben:@xeike: Das ist IMHO unschön solange nicht wirklich alle Werte von `foo()` auch benötigt werden. Und dann wäre es lesbarer wenn die Funktionssignatur nicht nur aus so einem allgemeinen Argument `meine_einstellungen` bestehen würde.
Die Kritik verstehe ich nicht.

* Ob oder ob nicht alle Elemente vom dict "einstellungen" gebraucht werden, ist zunächst unerheblich. Der OP wollte nur wissen, wie man Instanzen durch die Gegend reicht.

* dict ist der kleinste Datentyp, der sauber auf seine Elemente per Namen zugreifen kann, ohne weitere Module zu benutzen oder kompliziertere Sprachstrukturen zu bemühen oder gar "magic numbers" einzuführen.

* Störst du dich bei der funktion "foo()" daran, dass die Argumente nicht als Keywords vorliegen?

In dem Fall hilft dem OP vielleicht:

Code: Alles auswählen

def bar( ip="0.0.0.0", server="ww.example.org" ):
...   print( ip, server )
... 
>>> bar()
0.0.0.0 ww.example.org
>>> bar( *einstellungen )
ip server
>>> bar( **einstellungen )
127.0.0.1 ww.python-forum.de
Na, mal sehen.

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Mittwoch 12. Juni 2013, 16:39
von BlackJack
@xeike: Ich störe mich daran das so alle Einstellungen als „blob” überall herum gereicht werde. Das ist nicht besser als das ganze global zu machen. Das ist weder lesbar, noch nachvollziehbar.

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Mittwoch 12. Juni 2013, 18:45
von kbr
BlackJack hat geschrieben:Ich störe mich daran das so alle Einstellungen als „blob” überall herum gereicht werde.
Das stimmt natürlich und eine Klasse als reiner Attributcontainer macht die Sache auch nicht besser. Sie sollte dann bspw. auch Methoden zur Persistenz haben; so könnte sie auch kurzlebig eingesetzt und an anderer Stelle wieder mit den gespeicherten Werten neu instanziiert werden. Ist aber nur eine Idee — je nach Einsatzzweck gibt es sicher auch bessere oder gar einfachere Möglichkeiten.
@friedduck: Das "herumreichen" von Objekten erfolgt genauso wie bei allen anderen Variablen/Labels.

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Mittwoch 12. Juni 2013, 19:02
von friedduck
Hallo an alle und danke für die zahlreichen Antworten,

ich persönlich favorisiere die lösung von kbr, mit einer Klasse, so könnte ich noch ein paar Methoden reinnehmen um z.B den SMTP Server abzufragen.
Wie mache ich denn meine Klasse persistent? Wahrscheinlich so wie in meinem Anfangsbeitrag?

Code: Alles auswählen

class Testklase(object):
  def __init__(self):
    self.wert1 = 'wert1'
    self.wert2 = 'wert2'

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Donnerstag 13. Juni 2013, 08:45
von xeike
Da du ja nur eine Instanz benötigst, könntest du ein Singleton nehmen:
siehe: http://www.python.org/dev/peps/pep-0318/#examples

Zum Thema Persistenz siehe z. B.
http://docs.python.org/3.3/library/shelve.html

Xe

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Donnerstag 13. Juni 2013, 12:04
von friedduck
Hallo xeike,
sind die Singletons nicht verrufen?
http://lucumr.pocoo.org/2009/7/24/singl ... in-python/

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Donnerstag 13. Juni 2013, 12:41
von cofi
Ja, wenn, sollte man das Borg-Pattern benutzen. Man kann es sich aber auch einfach machen und einfach nur _ein_ Exemplar erzeugen, das funktioniert wunderbar, denn Python-Module sind natuerliche Singletons.

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Donnerstag 13. Juni 2013, 19:36
von friedduck
Man kann es sich aber auch einfach machen und einfach nur _ein_ Exemplar erzeugen
Wie meinst du das?

Abgesehen davon, glaube ich, das mein Codedesign / Strukturierung nicht optimal ist. Die ganzen importe bringen mich echt um den Verstand,
das kann nicht im Sinne des Erfinders sein ( oh Guido...).

Also zurück zum Anfang...

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Donnerstag 13. Juni 2013, 19:40
von BlackJack
@friedduck: Na man erzeugt nur ein Exemplar. Und nicht mehr als eins. Nicht, zwei. Nicht drei. Nur eins eben. Auf keinen Fall mehr. Das lässt man einfach bleiben. Und gut ist. :-)

Re: Klasse oder Dict, was am besten nehmen?

Verfasst: Donnerstag 13. Juni 2013, 19:47
von friedduck
BlackJack hat geschrieben:@friedduck: Na man erzeugt nur ein Exemplar. Und nicht mehr als eins. Nicht, zwei. Nicht drei. Nur eins eben. Auf keinen Fall mehr. Das lässt man einfach bleiben. Und gut ist. :-)
:D
Aber das wäre ja völlig gegen den Grundsatz "Viel, hilft auch viel!" :wink: