Применение документации к функциям с несколькими диспетчерами
Я использую пакет multipledispatch
в моде аналогично приведенному ниже примеру кода. Я хочу иметь возможность видеть текст docstring
, когда я запрашиваю help(my_add)
в командной строке Python, но вместо этого я вижу только информацию о декораторе.
Functools.wraps
должен быть способ сделать это, но как?
Я просмотрел functools.wraps
, и я уверен, что это то, что я хочу использовать. Я нашел примеры того, как его использовать, например это и это.
Но я до сих пор не совсем понимаю два вопроса:
- Как применить
functools.wraps
к внешним декораторам, которыми я не "владею". - Как применить это конкретно к этому случаю с множественной отправкой, поскольку функция, которую я хочу обернуть, будет иметь несколько
docstrings
, связанных с одним и тем же именем функции.
Пример: создание украшенной функции
Ниже приведен пример, который поможет объяснить.
>>> from multipledispatch import dispatch
>>> @dispatch(str, str)
... def my_add(elem1, elem2):
... '''A flavor of 'add' where two strings are concatenated.'''
... return elem1 + ' ' + elem2
...
>>> @dispatch(int, int)
... def my_add(elem1, elem2):
... '''A flavor of 'my_add' where two strings are concatenated.'''
... return elem1 + elem2
...
>>> my_add('hey','you')
'hey you'
>>> my_add(4, 5)
9
>>> my_add(4.5, 6)
(детали трассировки удалены...)
KeyError: (<class 'float'>, <class 'int'>)
During handling of the above exception, another exception occurred:
NotImplementedError: Could not find signature for my_add: <float, int>
Я хотел показать эту ошибку и разные диспетчеры просто для того, чтобы показать, что эта часть работает так, как я этого хочу (ищу совпавший диспетчер и вызывая связанный с ним «аромат» функции).
Пример: Вызов help
в оформленной функции не удался!
Но затем, если я попытаюсь просмотреть справку, вместо простого docstring
, который я предоставил, я увижу строку документации, связанную с декоратором @dispatch
.
>>> help(my_add)
Help on Dispatcher in module multipledispatch.dispatcher object:
my_add = class Dispatcher(builtins.object)
| Methods defined here:
|
| __call__(self, *args, **kwargs)
| Call self as a function.
|
| __getstate__(self)
|
и т. д.
Я даже не уверен, что он должен показать, поскольку есть потенциально две конфликтующие строки документации, которые я хотел бы продвинуть вперед. Итак, я попытался посмотреть, могу ли я вызвать справку для функции, которая фактически запущена, но затем, конечно, она дает мне справку по возвращаемому типу данных. Например.,
>>> help(my_add(3, 5))
Help on int object:
class int(object)
| int(x=0) -> integer
| int(x, base=10) -> integer
|
| Convert a number or string to an integer, or return 0 if no arguments