Nach help(getattr)
, zwei oder drei Argumente werden akzeptiert:Ist es möglich, eine Funktionssignatur zu schreiben, die sich wie getattr() verhält?
getattr(...)
getattr(object, name[, default]) -> value
einige einfache Tests tun, können wir dies bestätigen:
>>> obj = {}
>>> getattr(obj, 'get')
<built-in method get of dict object at 0x7f6d4beaf168>
>>> getattr(obj, 'bad', 'with default')
'with default'
Zu wenige/zu viele Argumente auch wie erwartet verhalten:
Die im Hilfetext angegebenen Argumentnamen scheinen nicht als Schlüsselwortargumente akzeptiert zu werden:
>>> getattr(object=obj, name='get')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: getattr() takes no keyword arguments
Das inspect
Modul ist keine Hilfe hier:
>>> import inspect
>>> inspect.getargspec(getattr)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/inspect.py", line 816, in getargspec
raise TypeError('{!r} is not a Python function'.format(func))
TypeError: <built-in function getattr> is not a Python function
(messaging is a little different in python3, but the gist is the same)
Nun ist die Frage: Gibt es eine einfache Möglichkeit, meine eigene Python-Funktion mit einer Signatur zu schreiben, die genau wie getattr
‚Unterschrift verhält? Das heißt, Schlüsselwortargumente sind nicht erlaubt und minimale/maximale Anzahl von Argumenten wird erzwungen. Die nächstgelegene ich gekommen, ist die folgende:
def myfunc(*args):
len_args = len(args)
if len_args < 2:
raise TypeError('expected at least 2 arguments, got %d' % len_args)
elif len_args > 3:
raise TypeError('expected at most 3 arguments, got %d' % len_args)
...
Aber jetzt statt sinnvollen Argumente Namen wie object
und name
wir bekommen args[0]
und args[1]
. Es ist auch eine Menge Standard, und fühlt sich geradezu unangenehm an. Ich weiß, dass eine eingebaute, getattr
sehr unterschiedliche Implementierung als typischer Python-Code haben muss, und vielleicht gibt es keine Möglichkeit, die Art, wie es sich verhält, perfekt zu emulieren. Aber es ist eine Kuriosität, die ich seit einer Weile habe.
@Makoto: kein Duplikat; optionale Argumente sind einfach, aber diese Frage sucht auch nur nach positionsbezogenen Argumenten. – user2357112