module zwingend für andere skripte/programme?

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.
Antworten
NoRulez
User
Beiträge: 36
Registriert: Donnerstag 1. November 2007, 15:31

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
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.
NoRulez
User
Beiträge: 36
Registriert: Donnerstag 1. November 2007, 15:31

und wie sieht's mit Punkt 1 aus?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
NoRulez
User
Beiträge: 36
Registriert: Donnerstag 1. November 2007, 15:31

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
NoRulez
User
Beiträge: 36
Registriert: Donnerstag 1. November 2007, 15:31

@BlackJack: zu punkt 2, dachte das geht irgendwie mit setattr oder so ähnlich.
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*.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
acoolon
User
Beiträge: 27
Registriert: Samstag 2. August 2008, 20:16

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?
Zuletzt geändert von acoolon am Dienstag 2. September 2008, 15:48, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
acoolon
User
Beiträge: 27
Registriert: Samstag 2. August 2008, 20:16

:)

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?)
NoRulez
User
Beiträge: 36
Registriert: Donnerstag 1. November 2007, 15:31

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
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
NoRulez
User
Beiträge: 36
Registriert: Donnerstag 1. November 2007, 15:31

@BlackJack: Ach sei doch nicht so ;-) Ein gutes Werk am Tag und mir wäre seehr geholfen

Lg NoRulez
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Mein gutes Werk ist ja gerade nichts zu verraten. :-)
NoRulez
User
Beiträge: 36
Registriert: Donnerstag 1. November 2007, 15:31

@Leonidas: Wieso kämpfe ich gegen diese Sprache an?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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".
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten