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()