Verständnisfrage

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
Braindie
User
Beiträge: 20
Registriert: Mittwoch 10. Juni 2009, 07:54

Hi Leute,

Ich versuch euch mal meine Begriffstutzigkeit zu erklären. Ich importiere in der Pythondatei a die Pythondatei b. In der Datei b habe ich eine Funktion in der alle weiteren Funktionen via Dictonary hinterlegt sind. Dann führe ich Datei a aus. Das ganze funktioniert jedoch nur wenn ich in der Datei b einen import auf die eigene Datei einbinde. Wenn ich das nicht mach steigt er in der Datei a immer mit dem Hinweis aus, dass die Variable b nicht bekannt.
Und hier steige ich vom Verständinis gerade aus. Könnte mir das einer erklären.
Anbei Beispielcode

Vielen Dank

Stefan

Datei a

Code: Alles auswählen

import b

i = b.test()
a = i.keys()
text = i[a[0]]() 
Datei b

Code: Alles auswählen

import b

def test():
    inventar = {'test2': b.test2}
    return inventar

def test2():
    c = 'test
    return  c
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ich habe kein Problem hier nachdem ich in test2() das Stringende gefixt habe.

Mit welcher Python-Version arbeitest du und wie lautet die Fehlermeldung genau? Prosatexte a la "Dann sagt er ..." sind bei der Fehlersuche nicht so hilfreich - mal abgesehen davon, dass ich mich immer frage, wer denn dieser ominöse "er" eigentlich ist.
Braindie
User
Beiträge: 20
Registriert: Mittwoch 10. Juni 2009, 07:54

Also mit er habe ich wohl mein guten alten Pc gemeint.

Wenn Du das

Code: Alles auswählen

import b 
aus der Datei b nimmt dann kommt die Fehlermeldung:
NameError: global name 'b' is not defined

Ich verstehe halt nicht warum ich in der Datei b auch b importieren muss.

Stefan
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Braindie hat geschrieben:
Ich verstehe halt nicht warum ich in der Datei b auch b importieren muss.

Stefan
Weil du in deinem Dictionary die Funktion test2 mit 'b.' referenzierst. Du willst sie also aus dem Namespace 'b' holen, der aber in Modul b gar nicht existiert - oder halt erst, wenn du b importierst und ihn damit erschaffst. Streiche das 'b.' im Dict, und du kannst auf 'import b' verzichten.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Statt

Code: Alles auswählen

b.test2
einfach

Code: Alles auswählen

test2
MfG
HWK
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

deswegen:

Code: Alles auswählen

inventar = {'test2': b.test2}
lass mal das b weg und importiere es nicht...

Allerdings frage ich mich, was du da eigentlich machen willst? Auf die Funktionen in "b" kann man mit Sicherheit besser zugreifen.

EDIT: zu langsam...
Braindie
User
Beiträge: 20
Registriert: Mittwoch 10. Juni 2009, 07:54

Vielen Dank an HWK und SchneiderWeisse,

ich habe gedacht, dass ich die Funktion mit dem b so einbinden muss, aber jetzt wird es klar.

@SchneiderWeisse:
Ich habe mit wxpython eine Programm geschrieben, in dem ich auf eine HDF5-Datei zugreife. Dort kann ich mit den dahinterliegenden Daten Diagramme erstellen. Für das einbinden neuer Skripte,die für die Erstellung dieser Diagramme benötigt werden, verwende ich diese Methode. So brauche ich nur den neuen Quellcode in das Pythonfile zu schieben und oben in der in mein Dictonary einfügen. Wenn du jetzt das Programm startest, hast du automatisch das neue Diagramm zur Verfügung zu stehen und kannst damit das Diagramm erstellen.
Ich hoffe ich konnte deine neugier stillen.

Vielen Dank nochmal

Ciao

Stefan
Antworten