@jonas: Noch ein paar Anmerkungen:
Statt eine Liste mit den Elementen von `dictionary` in der `create_command()` zu erzeugen und darüber zu iterieren ist `iteritems()` besser.
Warum prüfst Du ob `key` im Dictionary ist um gegebenenfalls einen `KeyError` auszulösen, wo das doch das normale Verhalten ist, wenn man einfach darauf zugreift? Und auch hier wird wieder unnötigerweise eine Liste mit den Schlüsseln erzeugt um dann in linearer Zeit zu schauen ob der Schlüssel da drin enthalten ist. Schlüssel kann man auch ganz einfach mit ``key in dictionary`` überprüfen und das geht viel schneller.
`inputtype` und `func` könnte man auch mittels "sequence unpacking" zuweisen, dann spart man sich eine Zeile und unnötige Indexzugriffe.
Der Formatcode '%s' sorgt dafür dass das Objekt in eine Zeichenkette umgewandelt wird, da muss man nicht selber vorher `str()` verwenden.
Warum hängst Du den `SEPARATOR` überall an statt ihn zum "joinen" zu verwenden?
`make_function_dictionary()` ist insgesamt ein wenig komisch. Das `typedictionary` wird bei jedem Schleifendurchlauf neu erstellt und auch die ganzen ``lambda``-Funktionen darum werden immer wieder neu erstellt. Und `inputtype` in dem Dictionary entspricht ja genau dem Key mit dem Du dann darauf zugreifst. Ich würde das Dictionary da rausziehen und nur die Typen auf die Funktionen abbilden. Und zwar auf Funktionen mit *zwei* Argumenten: Wert und `parameter`. Den kann man dann mit `functools.partial` in der Schleife an den aktuellen Parameter binden.
Auf Wahrheitswerte sollte man übrigens nicht mit ``is`` Testen. Das kann funktionieren, muss es aber nicht.
Code: Alles auswählen
from functools import partial
SEPARATOR = ' '
def make_function_dictionary(dictionary):
converters = {
bool: lambda p, v: str(p) if v else '',
int: lambda p, v: str(p) + SEPARATOR + str(v),
str: lambda p, v: str(p) + SEPARATOR + str(v),
tuple: lambda p, v: str(p) + SEPARATOR + SEPARATOR.join(map(str, v))
}
return dict((k, [t, partial(converters[t], p)])
for k, (t, p) in dictionary.iteritems())
def create_command(dictionary, **keywords):
command = list()
for key, value in keywords.iteritems():
inputtype, func = dictionary[key]
if isinstance(value, inputtype):
command.append(func(value))
else:
raise ValueError('%s is not type of %s' % (value, inputtype))
return SEPARATOR.join(command)
def main():
notready = {
'keyE': [bool, '-keyE'],
'keyF': [str, '-keyF'],
'keyG': [int, '-keyG'],
'keyH': [tuple, '-keyH']
}
notready = make_function_dictionary(notready)
print create_command(notready, keyE=False, keyF='example', keyH=(1, 2))
if __name__ == "__main__":
main()