Я получил несколько существующих файлов 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)?Спасибо