Ich habe ein Problem mit 'globalen', das ich gerne vermeiden möchte, mir aber bisher die zündende Idee fehlt.
Als Grundlage verwende ich das Textmenü, aus dem Textmenü-Tutorial von Hyperion.
Die Funktion zum Menüpunkt 'Eintrag suchen', sieht so aus:
Code: Alles auswählen
nameline = 'Nummer', 'Python2', 'Python3', 'Info'
def search_entry():
nl0 = len(nameline[1])
nl1 = len(nameline[2])
while True:
entry = input('\nSuchbegriff: ')
if entry:
print("\nEintrag wird gesucht")
with open(datapool, 'r') as infile:
reader = csv.reader(infile, delimiter="\t", quotechar="^")
global dataline
dataline = list()
r0 = set()
r1 = set()
global counter
counter = 0
for row in reader:
if row[0] == entry:
counter += 1
r0.add(len(row[0]))
r1.add(len(row[1]))
data = counter, row[0], row[1], row[2]
dataline.append(data)
elif entry in str(row):
counter += 1
r0.add(len(row[0]))
r1.add(len(row[1]))
data = counter, row[0], row[1], row[2]
dataline.append(data)
if counter == 0:
print('\nEs liegen keine Ergebnisse zu Ihrem Suchbegriff %s vor\n' % entry)
break
elif counter > 0:
print('\n-----\n{}:\t{}:{}{}:{}{}:'.format(nameline[0], nameline[1], ' ' * (4 + (max(r0) - nl0)), nameline[2], ' ' * (4 + (max(r1) - nl1)), nameline[3]))
for row in dataline:
print('{}\t{}{}{}{}{}\n'.format(row[0], row[1], ' ' * (max(r0) - len(row[1]) + 5), row[2], ' ' * (max(r1) - len(row[2]) + 5), row[3]))
print('-----')
break
Hoffe, es sieht nicht zu abenteuerlich für Euch aus.
Ich wollte die Ausgabe in einem bestimmten Format ausgeben. Die oberste Zeile sollte die Spaltenbenennung beinhalten. Die Ausgabezeilen mit Daten, sollten genau vertikal mit der Spaltenbenennung übereinstimmen.
Den Parameter 'nameline', habe ich bewußt global gesetzt, um später aus verschiedenen Funktionen, darauf zugreifen zu können.
Ich weiß ... 'global' ..., das stört mich selbst, aber zuerst möchte ich Euch den Zusammenhang nahe bringen!
Nun habe ich mir gedacht, daß diese Funktion 'search_entry()' auch für den Menüpunkt 'Eintrag ändern' verwendet werden kann, um doppelten Code zu vermeiden.
Dazu sieht die Funktion 'load()' zu dem Menüpunkt 'Eintrag ändern' folgendermaßen aus (ist aber noch nicht fertig!):
Code: Alles auswählen
def load():
search_entry()
while True:
try:
selection = int(input('Zeilennummer: '))
if int(1 <= selection <= counter):
for row in dataline:
if selection == row[0]:
print("\nDatensatz wird geladen\n")
chanceline = row[1:]
print(chanceline)
break
else:
print('Falsche Eingabe, bitte wählen Sie eine Zahl von 1 bis %s aus!' % counter)
except (ValueError, IndexError):
print('Falsche Eingabe, bitte wählen Sie eine Zahl von 1 bis %s aus!' % counter)
break
Ich brauche (im Moment noch) die zwei 'globalś' für diese Funktion.
Nun wenn ich das richtig verstanden habe, soll Rekursion vermieden werden!
In meinem Beispiel rufe das Hauptmenü 'handle_menu(menu)' auf, wähle dort einen Menüpunkt bei der die zugehörige Funktion, einen vordefinierten Ablauf durchgeht und am Ende wieder zum Hauptmenü zurückkehrt.
Um doppelten Code zu vermeiden, nutze ich also in der Funktion 'load()', die Funktion 'search_entry()' mit und benötige aus 'search_entry()' zwei Parameter.
Wie kann ich das umsetzen, ohne wieder eine Rekursion zu verwenden?