Seite 1 von 1

module zwingend für andere skripte/programme?

Verfasst: Montag 1. September 2008, 20:20
von NoRulez
Hey @all,

Im prinzip sind es 2 Fragen:
1.) ist es in python irgendwie machbar ein module zwingend zu importieren? So das man für ein Projekt nicht dauernd "import module1" schreiben muss? Ev. __builtin__?
2.) Ich möchte im 1.sten schritt die werte der globale variable 'Paramater' verwenden können und im 2ten diese ändern ohne jedoch unabsichtlich die 3 benötigten (x, y und z) löschen bzw. überschreiben zu können, statt löschen sollen sie zurückgesetzt werden

Sprich

Code: Alles auswählen

# module1.py

Parameter = {'x' : 2300.3423, 'y' = 2300.1, 'z' : 0.0 }

class TestClass:
    def __init__(self):
        """ Erzeuge was """
        # Hole werte aus Datei
        print "Original Werte: ", Parameter
        pass
    def __del__(self):
        """ Zerstöre was """
        # Schreibe werte in Datei
        print "Veränderte Werte: ", Parameter
        pass

Code: Alles auswählen

# use1.py => Benutzt module1.py

Parameter = {'x' : 0, 'y' = 0, 'z' : 0}

t = TestClass
# Mach irgendwas

Parameter['name'] = "Objekt1"
Parameter = []    # --> Nach aufruf, soll noch immer x, y und z verfügbar sein, eventuell auf 0 zurückgesetzt aber vorhanden
del t
Wenn es fertig ist soll es in etwas so aussehen

Code: Alles auswählen

Original-Werte: { 'x' : 2300.3423, 'y' = 2300.1, 'z' : 0.0 }
Veränderte Werte:  { 'name' : 'Objekt1', 'x' : 0, 'y' = 0, 'z' : 0 }
Vielen Dank im Voraus
NoRulez

Verfasst: Montag 1. September 2008, 20:30
von BlackJack
Such Die bitte eine andere Programmiersprache. Zumindest das zweite kann Python nicht, weil Zuweisungen keine überladbaren Operatoren sind, und beide Sachen *will* man nicht machen.

PS: `__del__()` ist kein deterministischer Destruktor, wann oder ob die Methode überhaupt aufgerufen wird, garantiert Python in keinster Weise.

Verfasst: Montag 1. September 2008, 21:01
von NoRulez
und wie sieht's mit Punkt 1 aus?

Verfasst: Montag 1. September 2008, 21:12
von EyDu
Also eigentlich willst du immer import schreiben, wenn du ein Modul importieren möchtest ;-) Wenn du jedes Mal eine riesen Menge von den selben Modulen mit einbindest, dann hast du irgend etwas falsch gemacht.

Verfasst: Montag 1. September 2008, 21:58
von NoRulez
Nein es geht darum das es eine Klasse gibt, wodurch dann jeder Programmierer in der Firma somit mehr oder weniger gezwungen ist die Klasse zu verwenden bzw. eine instanz davon zu erzeugen.

Beispielsweise könnte es im Module1.py eine Klasse geben die - was weiß ich - Datenbankoperationen vornimmt, vorher das System auf OS-Version überprüft, ... oder was auch immer.

Jedenfalls soll der Programmierer mindestens in diesem Fall

Code: Alles auswählen

t = TestClass
schreiben und danach halt seine Aufgabe erledigen

Der Sinn soll es im end effekt sein das nicht jeder programmierer neue Datenbankschnittstellen programmiert, sondern die einmal durchdachten schnittstellen nutzt. Da das aber leider nicht der Fall ist,
wollte ich wissen ob man das irgendwo in python (deswegen __builtin__?) so deklarieren kann, das er nicht extra ein modul einbinden muss, sondern das modul automatisch geladen wird, sobald er eine instanz erzeugt.
Somit braucht er auch nicht wissen welches modul verwendet wird usw. und wir haben eine nahezu kompatible (ansi) schnittstelle zu jedem script

Als "Beispiel" einfach mkdir benutzen ohne es entweder mittels os.mkdir aufzurufen oder vorher das os module explicit zu importieren.
Der Programmierer soll nun in der Lage sein einfach von 0 heraus ein modul/skript zu schreiben, was aber von sich aus schon das modul os importiert, ohne extra "import os" odgl. zu schreiben

Lg NoRulez

Verfasst: Montag 1. September 2008, 21:58
von NoRulez
@BlackJack: zu punkt 2, dachte das geht irgendwie mit setattr oder so ähnlich.

Verfasst: Montag 1. September 2008, 22:11
von BlackJack
Das so eine Klasse automatisch verfügbar ist, hindert doch keinen *trotzdem* seine eigene Datenbankschnittstelle zu implementieren. So etwas kann man nur durch Vernunft und Einsicht lösen und nicht technisch.

Zu Punkt 2: Du bindest den Namen an ein anderes Objekt. Damit ist unter dem Namen die Liste ansprechbar und nicht mehr das Dictionary.

Mal so nebenbei vergisst Du `TestCase` auch *aufzurufen*.

Verfasst: Dienstag 2. September 2008, 08:26
von mkesper
NoRulez hat geschrieben:Der Sinn soll es im end effekt sein das nicht jeder programmierer neue Datenbankschnittstellen programmiert, sondern die einmal durchdachten schnittstellen nutzt. Da das aber leider nicht der Fall ist,[...]
Also in manchen Unternehmen wird so etwas vorgeschrieben.
Wenn sich die Programmierer nicht dran halten, läuft irgend etwas schief.

Verfasst: Dienstag 2. September 2008, 09:11
von Hyperion
Ich kann vor allem nicht verstehen, wieso man sich das Leben schwer machen sollte? Ist doch toll, wenn es bereits ein Werkzeug für eine Aufgabe gibt, das ich nutzen kann. So komme ich schneller zum Ziel.

Andererseits sollte man sich auch mal fragen, wieso andere Programmierer eine gegebene Schnittstelle nicht nutzen:
- Wird diese auch gut genug "promoted"
- Ist sie evtl. einfach ungeeignet oder fehlerhaft?

Kommunikation heißt da die Lösung ;-)

Verfasst: Dienstag 2. September 2008, 14:54
von acoolon
also so weit mein verstaendnis geht kannst du deiner klasse das dictionary uebergeben...

Code: Alles auswählen

a = ('bla', 'blub', 'blue')

class Test(object):
    def __init__(self,liste):
        self.liste = liste
        print liste

t = Test(a)

so geht das bei mir...wenn es das ist was du willst

EDIT: Ich verstehe dich nicht: du hast ein dictionary willst es mit einem modul bearbeiten lassen und dann sollen seine werte auf null gesetzt werden?

Verfasst: Dienstag 2. September 2008, 15:34
von Leonidas
acoolon hat geschrieben:also so weit mein verstaendnis geht kannst du deiner klasse das dictionary uebergeben...
Jetzt mal davon abgesehen, dass das was du da als ``a`` übergibst ein Tupel und kein Dictionary ist.

Verfasst: Dienstag 2. September 2008, 15:36
von acoolon
:)

genau davon mal abgesehen...ok soweit geht mein vertaendnis dann doch...

es geht hier ja um die ganz grobe theorie...(mit dictionarys habe ich nocht nicht so viel gemacht, bin da noch nicht so fit drin...wird das mir verziehen?)

Verfasst: Dienstag 2. September 2008, 16:53
von NoRulez
Es geht mir nicht darum ein dictionary zu löschen oder auf null zu setzen,
ich möchte einfach ein modul haben, das automatisch bei jedem neuen Programm/projekt oder skript eingebunden wird.

Erreicht habe ich es bisher wie folgt:

Code: Alles auswählen

# module1.py

Parameter = {'x' : 2300.3423, 'y' = 2300.1, 'z' : 0.0 }

class TestClass:
    def __init__(self):
        """ Erzeuge was """
        # Hole werte aus Datei
        print "Original Werte: ", Parameter
        pass
    def __del__(self):
        """ Zerstöre was """
        # Schreibe werte in Datei
        print "Veränderte Werte: ", Parameter
        pass

Code: Alles auswählen

# use1.py => Benutzt module1.py

# Auf diese Zeile möchte ich gerne verzichten und möchte das dies automatisch geschieht
from module1 import *

# Nun kann ich auf die Variable/Dictionary 'Parameter' zugreifen
# und die Klasse TestClass Benutzen

Parameter = {'x' : 0, 'y' = 0, 'z' : 0}

t = TestClass
Mir geht es darum das nicht ein - nennen wir es konstanter Key - versehentlich gelöscht wird. In diesem Fall sollen die Keys x, y und z vorhanden bleiben falls das Dictionary versehentlich gelöscht wird und/oder eben einer der 'konstanten keys' entfernt wird.

Zu Punkt 1 soll es so sein, das wenn am Schluss der Destructor der Klasse 'TestClass' aufgerufen wird bzw. das module1 entladen wird, die werte im Dictionary automatisch geupdatet werden, heißt in die Datenbank schreiben, in ein XML file schreiben, ... Ohne das der Programmierer davon weiß, oder wissen muss da es ja im hintergrund automatisiert läuft bzw. laufen soll.

Lg NoRulez

Verfasst: Dienstag 2. September 2008, 17:55
von BlackJack
Das ein Schlüssel aus einem Dictionary entfernt wird, kannst Du durch eine eigene Klasse erreichen, die eben das verhindert.

Aber das Dictionary kann gar nicht versehentlich gelöscht werden, weil man als Benutzer gar keine Objekte löschen kann. Man kann nur dafür sorgen, dass es keine Verweise mehr auf ein Objekt gibt.

Vergiss den "Destruktor" insbedondere wenn da etwas am Programmende passieren soll, weil genau in dem Fall am wahrscheinlichsten ist, dass `__del__()` *nicht aufgerufen* wird!

Du willst IMHO zuviel "Magie" haben, die sich mit Python's Philosophie nicht verträgt. Und die IMHO auch keine gute Idee ist. Darum verrate ich Dir nicht, wie Du Dir dieses Grab schaufeln kannst. :P

Verfasst: Dienstag 2. September 2008, 20:43
von NoRulez
@BlackJack: Ach sei doch nicht so ;-) Ein gutes Werk am Tag und mir wäre seehr geholfen

Lg NoRulez

Verfasst: Dienstag 2. September 2008, 21:18
von Leonidas
NoRulez hat geschrieben:Ein gutes Werk am Tag und mir wäre seehr geholfen
Eigentlich nicht, denn du kämpft gegen die Sprache an, Magie sollte dabei vermieden werden wenn es nich nötig ist. Und es ist nicht nötig.

Verfasst: Dienstag 2. September 2008, 22:04
von BlackJack
Mein gutes Werk ist ja gerade nichts zu verraten. :-)

Verfasst: Mittwoch 3. September 2008, 12:08
von NoRulez
@Leonidas: Wieso kämpfe ich gegen diese Sprache an?

Verfasst: Mittwoch 3. September 2008, 12:10
von Leonidas
NoRulez hat geschrieben:@Leonidas: Wieso kämpfe ich gegen diese Sprache an?
Weil du aus dem Python-Zen Grundsatz "Explicit is better than implicit" das Gegenteil machen willst: "Implicit is better than explicit".