Obwohl getattr() eine elegante (und etwa 7x schnellere) Methode ist, können Sie den Rückgabewert der Funktion (lokal, Klassenmethode, Modul) mit eval so elegant wie x = eval('foo.bar')()
. Und wenn man eine Fehlerbehandlung implementiert, dann ziemlich sicher (das gleiche Prinzip kann für getattr verwendet werden). Beispiel mit Modulimport und Klasse:
# import module, call module function, pass parameters and print retured value with eval():
import random
bar = 'random.randint'
randint = eval(bar)(0,100)
print(randint) # will print random int from <0;100)
# also class method returning (or not) value(s) can be used with eval:
class Say:
def say(something='nothing'):
return something
bar = 'Say.say'
print(eval(bar)('nice to meet you too')) # will print 'nice to meet you'
Wenn ein Modul oder eine Klasse nicht existiert (Tippfehler oder ähnliches), wird ein NameError ausgelöst. Wenn eine Funktion nicht existiert, wird ein AttributeError ausgelöst. Dies kann verwendet werden, um Fehler zu behandeln:
# try/except block can be used to catch both errors
try:
eval('Say.talk')() # raises AttributeError because function does not exist
eval('Says.say')() # raises NameError because the class does not exist
# or the same with getattr:
getattr(Say, 'talk')() # raises AttributeError
getattr(Says, 'say')() # raises NameError
except AttributeError:
# do domething or just...
print('Function does not exist')
except NameError:
# do domething or just...
print('Module does not exist')
8 Stimmen
Die Verwendung von eval würde wahrscheinlich einige Sicherheitsbedenken aufwerfen!
23 Stimmen
Zu Ihrer Information: Das Sprachmerkmal des Zugriffs auf Felder, Klassen und Methoden durch dynamische Namen heißt Reflexion . Das könnte die künftige Suche erleichtern.