При встраивании Python в мое приложение и написании типа расширения я могу добавить signature
к методу, используя правильно созданную строку .tp_doc
.
static PyMethodDef Answer_methods[] = {
{ "ultimate", (PyCFunction)Answer_ultimate, METH_VARARGS,
"ultimate(self, question='Life, the universe, everything!')\n"
"--\n"
"\n"
"Return the ultimate answer to the given question." },
{ NULL }
};
Когда help(Answer)
выполняется, возвращается следующее (сокращенно):
class Answer(builtins.object)
|
| ultimate(self, question='Life, the universe, everything!')
| Return the ultimate answer to the given question.
Это хорошо, но я использую Python3.6, который поддерживает аннотации.Я хотел бы аннотировать вопрос, чтобы быть строкой, и функция, чтобы возвратить int.Я попытался:
static PyMethodDef Answer_methods[] = {
{ "ultimate", (PyCFunction)Answer_is_ultimate, METH_VARARGS,
"ultimate(self, question:str='Life, the universe, everything!') -> int\n"
"--\n"
"\n"
"Return the ultimate answer to the given question." },
{ NULL }
};
, но это возвращается к нотации (...)
, и документация становится такой:
| ultimate(...)
| ultimate(self, question:str='Life, the universe, everything!') -> int
| --
|
| Return the ultimate answer to the given question.
, и запрос inspect.signature(Answer.ultimate)
приводит к исключению.
Traceback (most recent call last):
File "<string>", line 11, in <module>
File "inspect.py", line 3037, in signature
File "inspect.py", line 2787, in from_callable
File "inspect.py", line 2266, in _signature_from_callable
File "inspect.py", line 2090, in _signature_from_builtin
ValueError: no signature found for builtin <built-in method ultimate of example.Answer object at 0x000002179F3A11B0>
Я пытался добавить аннотации после факта с кодом Python:
example.Answer.ultimate.__annotations__ = {'return': bool}
Но дескрипторы встроенного метода не могут добавлять аннотации таким образом.
Traceback (most recent call last):
File "<string>", line 2, in <module>
AttributeError: 'method_descriptor' object has no attribute '__annotations__'
Есть ли способ добавить аннотации к методам расширения, используя C-API?
Аргументная клиника выглядела многообещающе и все еще может быть очень полезной, но по состоянию на 3.6.5 она не поддерживает аннотации .
annotation
Значение аннотации для этого параметра.В настоящее время не поддерживается, поскольку PEP 8 требует, чтобы библиотека Python не использовала аннотации.