Как проверить лямбда-аргументы после преобразования файлов Python в общую библиотеку Cython - PullRequest
0 голосов
/ 30 января 2019

Я получил несколько существующих файлов Python, и мне нужно преобразовать их в .so общие библиотеки.Я использую Cython, чтобы успешно скомпилировать их в .so.В целом это работает хорошо.Тем не менее, есть некоторые вызовы inspect.signature () в файлах python для получения аргументов функций, и они работают для общих функций, но вводят исключение для лямбда-функций.Я использую python для импорта этой разделяемой библиотеки и обнаружил, что после их цитонизации общие функции по-прежнему имеют атрибут __code__, а лямбда - нет.

Я хотел бы знать, если это возможно, я могу получить аргументы лямбда после цитонизации его.Мои файлы Python огромны, и ниже приведен пример кода, воспроизводящего эту проблему

test.py

import inspect

def func1(x,y, *args, **kargs):
    return x+y 

def func2(f3, f4 = (lambda z : "test lambda {0}".format(z))) :
    print("f3 = {0}, f3.__code__ = {1}, f3.arg = {2}".format(f3, f3.__code__, f3.__code__.co_varnames))
    print("f4 = {0}, f4.__code__ = {1}".format(f4, f4.__code__))

    print("inspect f3 = {0}".format(inspect.signature(f3)))
    print("inspect f3 param = {0}".format(inspect.signature(f3).parameters))

    print("inspect f4 = {0}".format(inspect.signature(f4)))
    print("inspect f4 par = {0}".format(inspect.signature(f4).parameters))
    #print("inspect getfullargspec f4 = {0}".format(inspect.getfullargspec(f4)))
    #print("inspect f4 par = {0}".format(inspect.signature(f4).parameters))

func2(func1)

После того, как я запечатлю его и соберу как общую библиотеку, я использую интерактивный режим Pythonимпортировать это.Тогда я получил

Python 3.6.2 (default, Oct 20 2017, 23:38:37) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import test

f3 = <cyfunction func1 at 0x7ffff06f1550>, f3.__code__ = <code object func1 at 0x7ffff0befc00, file "over.py", line 3>, f3.arg = ('x', 'y', 'args', 'kargs')
f4 = <cyfunction func2.<locals>.<lambda> at 0x7ffff06f16c0>, f4.__code__ = None
inspect f3 = (x, y, *args, **kargs)
inspect f3 param = OrderedDict([('x', <Parameter "x">), ('y', <Parameter "y">), ('args', <Parameter "*args">), ('kargs', <Parameter "**kargs">)])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "over.py", line 13, in over.func2
  File "/depot/Python-3.6.2/lib/python3.6/inspect.py", line 3033, in signature
    return Signature.from_callable(obj, follow_wrapped=follow_wrapped)
  File "/depot/Python-3.6.2/lib/python3.6/inspect.py", line 2783, in from_callable
    follow_wrapper_chains=follow_wrapped)
  File "/depot/Python-3.6.2/lib/python3.6/inspect.py", line 2262, in _signature_from_callable
    skip_bound_arg=skip_bound_arg)
  File "/depot/Python-3.6.2/lib/python3.6/inspect.py", line 2087, in _signature_from_builtin
    raise ValueError("no signature found for builtin {!r}".format(func))
ValueError: no signature found for builtin <cyfunction func2.<locals>.<lambda> at 0x7ffff06f16c0>

Вы можете увидеть f4 .__ code__ = Нет.Возможно ли получить количество аргументов и имена этой лямбды (f4)?Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...