ich beschäftige mich erst seit kurzem mit Python, arbeite beruflich mit einer anderen Sprache und möchte vermeiden, dass sich schlechte Angewohnheiten festsetzen.
Daher würde ich Euch bitten, Euch den folgenden Code anzuschauen, und wenn möglich zu bewerten.
Es geht mir darum, Strukturen, die man in Python anders machen würde als ich es getan habe, zu identifizieren. (Ausgangsthread zu meinem Anliegen).
Ich habe mir eine kleine Basisbibliothek aufgebaut, in der ich verschiedene Funktionen, die ich häufiger benutzen könnte, in separaten Files ausgelagert habe.
Es handelt sich dabei hauptsächlich um Wrapper um bereits vorhandene Funktionen, die einfacher im Aufruf sind, oder noch zusätzliche Aufgaben erledigen.
So gibt es bspw. Units, die Zugriff auf die Registry regeln, oder String-Routinen anbieten usw.
Das folgende Script soll eine Schnittstelle zu diesen 'Utilities' sein.
Ich möchte dieses Script mit verschiedenen Parametern aufrufen können, und dieses Script ruft dann die gewünschten Funktionen aus den anderen Scripten auf.
Mein Ziel war es, das Script möglichst allgemein und das Hinzufügen neuer Funktionen einfach zu halten.
Das Ganze soll bspw. vom Windows Task Scheduler genutzt werden, um bspw. regelmässig irgendwelche Registry-Einträge zu ändern, Services zu starten/beenden usw.
Ich würde mich freuen, wenn Ihr Euch das Ganze mal anseht und mir um die Ohren haut
Ich habe mir angewöhnt, möglichst viel zu kommentieren - das hat mir im Beruf oftmals weitergeholfen, da ich sehr vergesslich bin.
Es sollte daher ersichtlich sein, was ich erreichen möchte - auch wenn der Code selber evtl. sch.... ist
Besten Dank im Voraus für Eure Mühen.
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
Script: function_caller
Stellt eine Schnittstelle zu Funktionen anderer Skripte bereit und leitet
deren Aufruf ein
'''
from argparse import ArgumentParser
import fileutils
import inspect
import logfile
import sysutils
import registryutils
import exceptionutils
# ******************************************************************************
def show_help():
'''
Funktion:
Gibt die aufrufbaren Funktionen zurück
Paramater:
Rückgabe:
Alle aufrufbaren Funktionen
'''
string = ''
for function in functions:
string = string + function + '\n'
return string
# ******************************************************************************
# Logfile festlegen
log = logfile.Logfile(sysutils.get_windows_path('mydocuments') +
'\\logs\\function_caller.log')
log.Loglevel = 3
try:
# Definierte Funktionen
functions = {
'help': show_help,
'makedirs': fileutils.makedirs,
'regsetval': registryutils.set_registry_value
}
# Argument-Parser initialisieren
parser = ArgumentParser()
# Positional Arguments (müssen vorhanden sein)
parser.add_argument('function', help='function to be called')
# Optional Arguments (können vorhanden sein)
parser.add_argument('-nolog', help='log call')
parser.add_argument('-args', nargs='+', help='optional arguments')
# Argumente auslesen
args = parser.parse_args()
# Wenn die übergebene Funktion in der Liste der festgelegten Funktionen ist
func = args.function
if func in functions:
# Ermitteln, wieviele Argumente die Funktion erwartet
args_needed = inspect.getfullargspec(functions[func])
args_needed_count = len(args_needed.args)
# Default-Argumente müssen abgezogen werden
if args_needed.defaults != None:
def_args = args_needed.defaults[0]
else:
def_args = 0
# Wenn nicht die korrekte Anzahl an optionalen Argumenten für diese
# Funktion übergeben worden ist, Fehlermeldung
if args.args == None:
args_count = 0
else:
args_count = len(args.args)
# Wenn die Routine Defaultargumente beinhaltet, dann muss die Anzahl
# der übergebenen Argumente sich in der Range (min./max. Args) bewegen
if def_args != 0:
do_it = args_needed_count - def_args <= args_count <= args_needed_count
else:
do_it = args_count = args_needed_count
if not do_it:
parser.error('the function "%s" needs %s argument(s)' %
(func, args_needed_count - def_args))
# ansonsten ausführen
# (*args entpackt die Parameter auf der Gegenseite)
# Aufzurufende Funktion erwartet Argument
else:
if args_needed_count > 0:
result = functions[func](*args.args)
# erwartet kein Argument
else:
result = functions[func]()
# Ggf. Rückgabe ausgeben
print('function_caller result: %s' % (result))
if not args.nolog:
log.output(1, '\n function: %s \n arguments: %s \n result: %s \n' %
(func, args.args, result))
else:
print('invalid function')
except Exception as ex:
print(exceptionutils.throw_exception(ex))
log.output(1, 'Error in function "%s" (%s)' %
(func, exceptionutils.throw_exception(ex)))