Dictionary - Bäume
Verfasst: Donnerstag 16. August 2018, 15:17
Hallo Forum,
ich habe ein Problem in meinem Programm und finde es nicht, bin ein Anfänger
.
Das Programm soll Namensbereiche (Scopes) simulieren.
mit :
c <namespace> <parent> - wird eine Bereich (Funktion) im Parent erzeugt, wobei "global" der unterste Bereich ist.
a <namespace> <variable> - weist man eine Variabel dem Bereich zu.
g <namespace> <variable> - liefert den Namen des Bereichs, in dem <variable> zugewiesen wurde, also <namespace>, oder wenn die Variabel im direkten Parent vorhanden ist und nicht im <namespace> den Namen des Parent, oder Nono falls nicht vorhanden.
Dann gibt es paar Hilfsfunktionen:
p - Gibt unseren Baum(root) aus.
gc <namespace> - gibt die Kinderbereiche von <namespace> aus.
Ab der dritten Ebene funktioniert das Programm leider nicht richtig.
z.B. wenn ich
c foo global
c bar global
c fip foo
c fap foo
c bip bar
c bap bar
a bar b
g bip b
eingebe, wird None ausgegeben. Wenn ich gc bar eingebe wird auch None ausgegeben, obwohl wenn ich p eingebe, sind die Bereiche im Baum vorhanden.
[/code]
Ich finde den Fehler aber nicht, hoffe auf eure Hilfe.
ich habe ein Problem in meinem Programm und finde es nicht, bin ein Anfänger

Das Programm soll Namensbereiche (Scopes) simulieren.
mit :
c <namespace> <parent> - wird eine Bereich (Funktion) im Parent erzeugt, wobei "global" der unterste Bereich ist.
a <namespace> <variable> - weist man eine Variabel dem Bereich zu.
g <namespace> <variable> - liefert den Namen des Bereichs, in dem <variable> zugewiesen wurde, also <namespace>, oder wenn die Variabel im direkten Parent vorhanden ist und nicht im <namespace> den Namen des Parent, oder Nono falls nicht vorhanden.
Dann gibt es paar Hilfsfunktionen:
p - Gibt unseren Baum(root) aus.
gc <namespace> - gibt die Kinderbereiche von <namespace> aus.
Ab der dritten Ebene funktioniert das Programm leider nicht richtig.
z.B. wenn ich
c foo global
c bar global
c fip foo
c fap foo
c bip bar
c bap bar
a bar b
g bip b
eingebe, wird None ausgegeben. Wenn ich gc bar eingebe wird auch None ausgegeben, obwohl wenn ich p eingebe, sind die Bereiche im Baum vorhanden.
[/code]
Ich finde den Fehler aber nicht, hoffe auf eure Hilfe.
Code: Alles auswählen
root = {'global': {'names' : {}, 'vars' : []}}
def create(namespace, parent, adress = root):
for name in adress.keys():
if name == parent:
adress[name]['names'][namespace] = {'names' : {}, 'vars' : []}
return
else:
create(namespace, parent, adress[name]['names'])
def add(namespace, var, adress = root):
for name in adress.keys():
if name == namespace:
adress[name]['vars'].append(var)
else:
add(namespace, var, adress[name]['names'])
def get(namespace, var, lastvar = [], adress = root):
for name in adress.keys():
if name == namespace and var in lastvar or var in adress[name]['vars']:
return name
else:
return get(namespace, var, adress[name]['vars'], adress[name]['names'])
def get_childreen(namespace, adress = root):
for name in adress:
if name == namespace:
return set(adress[name]['names'].keys())
else:
return get_childreen(namespace, adress[name]['names'])
cmd = input()
while cmd != "":
cmd = cmd.split()
cmd.reverse()
a = cmd.pop()
if a not in ["p", "gc", "c", "a", "g"]:
print("wrong argument")
cmd = input()
continue
if a == "p":
print(root)
cmd = input()
continue
b = cmd.pop()
if a == "gc":
print(get_childreen(b))
cmd = input()
continue
c = cmd.pop()
if a == "c":
create(b, c)
elif a == "a":
add(b, c)
elif a == "g":
print(get(b,c))
cmd = input()