Angenommen, wir haben eine komplexe API-Funktion, die aus einer Bibliothek importiert wurde.
def complex_api_function(
number, <lots of positional arguments>,
<lots of keyword arguments>):
'''really long docstring'''
# lots of code
Ich möchte einen einfachen Wrapper um diese Funktion schreiben, um eine winzige Änderung vorzunehmen. Beispielsweise sollte es möglich sein, das erste Argument als Zeichenfolge zu übergeben. Wie kann man das dokumentieren? Ich habe folgende Optionen in Betracht gezogen:
Option 1:
def my_complex_api_function(number_or_str, *args, **kwargs):
'''
Do something complex.
Like `complex_api_function`, but first argument can be a string.
Parameters
----------
number_or_str : int or float or str
Can be a number or a string that can be interpreted as a float.
<copy paste description from complex_api_function docstring>
*args
Positional arguments passed to `complex_api_function`.
**kwargs
Keyword arguments passed to `complex_api_function`.
Returns
-------
<copy paste from complex_api_function docstring>
Examples
--------
<example where first argument is a string, e.g. '-5.0'>
'''
return complex_api_function(float(number_or_str), *args, **kwargs)
Nachteil: Der Benutzer muss sich die Dokumente von ansehen complex_api_function, um Informationen über *argsund zu erhalten **kwargs. Muss angepasst werden, wenn beim Kopieren Abschnitte aus der complex_api_functionÄnderung eingefügt werden .
Option 2:
Kopieren Sie die complex_api_functionSignatur (anstelle von *argsund **kwargs) und deren Dokumentzeichenfolge und fügen Sie sie ein. Nehmen Sie eine kleine Änderung an der Dokumentzeichenfolge vor, in der erwähnt wird, dass das erste Argument auch eine Zeichenfolge sein kann. Fügen Sie ein Beispiel hinzu.
Nachteil: ausführlich, muss bei complex_api_functionÄnderungen geändert werden .
Option 3:
Dekorieren Sie my_complex_api_functionmit functools.wraps(complex_api_function).
Nachteil: Es gibt keine Informationen, numberdie auch eine Zeichenfolge sein können.
Ich suche nach einer Antwort, die nicht von den Details abhängt, was sich ändert my_complex_api_function. Das Verfahren sollte für jede winzige Anpassung an das Original funktionieren complex_api_function.
complex_api_functionfür seinen Parameter erwartet, da dies nur Informationen dupliziert (möglicherweise haben sie auch mehrere Optionen). Vermutlich ist der Benutzer des Wrappers bereits mit der ursprünglichen Funktion vertraut, und wenn nicht, können Sie sie immer auf die Originaldokumente verweisen. Wie auch immer, ich denke, dies ist der richtige Weg. Dokumentieren Sie nur, was der ursprünglichen Funktion hinzugefügt wurde , und geben Sie Details darüber an, wie dieser neue Typ in den ursprünglichen Typ konvertiert wird (diese Details könnten wichtig sein). Dh wie dieses Argument behandelt wird, um mit der ursprünglichen Funktion kompatibel zu sein.