@IoannisFilippidis Я собирался сказать вам, что, возможно, стоит исправить ошибку, но похоже, что вы уже сделали это ...

аinspect Кажется, модуль не может проверять сигнатуры «встроенных» функций, которые включают в себя функции, определенные в модулях расширения C, например, определенные в Cython. Есть ли способ получить сигнатуру функции Python, которую вы определили в таком модуле, и в частности в Cython? Я ищу, чтобы найти доступные аргументы ключевых слов.

MWE:

# mwe.pyx
def example(a, b=None):                                                                                                                                                       
    pass       

а также

import pyximport; pyximport.install()                                                                                                                                         
import mwe                                                                                                                                                                    
import inspect                                                                                                                                                                

inspect.signature(mwe.example)   

выходы:

Traceback (most recent call last):                                                                                                                                           
  File "mwe_py.py", line 5, in <module>                                                                                                                                      
    inspect.signature(mwe.example)                                                                                                                                           
  File "/nix/store/134l79vxb91w8mhxxkj6kb5llf7dmwpm-python3-3.4.5/lib/python3.4/inspect.py", line 2063, in signature                                                         
    return _signature_internal(obj)                                                                                                                                          
  File "/nix/store/134l79vxb91w8mhxxkj6kb5llf7dmwpm-python3-3.4.5/lib/python3.4/inspect.py", line 1965, in _signature_internal                                               
    skip_bound_arg=skip_bound_arg)                                                                                                                                           
  File "/nix/store/134l79vxb91w8mhxxkj6kb5llf7dmwpm-python3-3.4.5/lib/python3.4/inspect.py", line 1890, in _signature_from_builtin                                           
    raise ValueError("no signature found for builtin {!r}".format(func))                                                                                                     
ValueError: no signature found for builtin <built-in function example>    

В Python 3.4.5 и Cython 0.24.1

 Gilly05 сент. 2017 г., 12:55
@DavidW Спасибо, я видел эти ответы, но подумал, добавляет ли Cython какое-то волшебство, чтобы эта работа сработала. Извините, наверное, следовало включить в вопрос
 Gilly09 сент. 2017 г., 07:38
@MSeifert Я обновил с MWE. Если бы вы проголосовали -1, вы не против?
 DavidW04 сент. 2017 г., 10:54
 MSeifert04 сент. 2017 г., 10:45
Почему это не должно быть возможно?inspect.signature(all) (например, чтобы извлечь подписьall) работает отлично<Signature (iterable, /)>, Пожалуйста, предоставьтеМинимальный, полный и проверяемый пример так что ответы могут показать вам, как это сделать втвой случай.
 DavidW04 сент. 2017 г., 10:55
Также актуально:stackoverflow.com/questions/1104823/...

Ответы на вопрос(1)

Решение Вопроса

что это было невозможно ...), продолжив расследование. Кажется, что он отлично работает с достаточно свежими версиями Cython (v0.23.4) и Python 3.4.4.

import cython
import inspect
scope = cython.inline("""def f(a,*args,b=False): pass """)
print(inspect.getfullargspec(scope['f']))

дает вывод

FullArgSpec(args=['a'], varargs='args', varkw=None, defaults=None, kwonlyargs=['b'], kwonlydefaults={'b': False}, annotations={})

Также упоминается вдокументация это вариант компиляцииbinding" что, по-видимому, делает эту деталь более доступной (хотя она мне и не нужна).

У меня есть ощущение, что это может зависеть от улучшенияinspect сделано сравнительно недавно (возможноэто исправить) так что если вы используете Python 2, вам, вероятно, не повезло.

Редактировать: ваш пример работает, если вы используетеbinding опция компиляции:

import cython
@cython.binding(True)
def example(a, b=None):                                                                                                                                                       
    pass

Я подозреваю чтоinline добавляет его автоматически (но код сделатьinline достаточно запутанный, что я не могу найти доказательства этого в любом случае). Вы также можете установить его как параметр уровня файла.

 DavidW09 сент. 2017 г., 10:25
@IoannisFilippidis Я собирался сказать вам, что, возможно, стоит исправить ошибку, но похоже, что вы уже сделали это ...
 Ioannis Filippidis09 сент. 2017 г., 10:09
getfullargspec а такжеsignature похоже, неправильно получают аргументы ключевого слова дляcdef методы класса, хотя они делают дляpyx функции модуля. Аргументы ключевых слов выглядят так, как будто они являются позиционными аргументами. Эти функции правильно получают имена аргументов для функций модуля.
 DavidW05 сент. 2017 г., 19:36
@Gilly See edit - это всего лишь один из примеров того, что вы используетеbinding
 Gilly09 сент. 2017 г., 07:37
Спасибо куча! Именно то, что я искал.
 Gilly05 сент. 2017 г., 13:00
Спасибо Дэвид, я обновил вопрос с MWE, кажется, не работает с импортом, в отличие от встроенной функции.

Ваш ответ на вопрос