как вытащить функцию из слота хранилища - PullRequest
2 голосов
/ 11 октября 2019

Просто вопрос из интереса к Python. Как вытащить функцию из этого слота? Здесь у меня есть пример:

>>> def func():
    pass

>>> func
<function func at 0x00000280B1883288>

Итак, 0x00000280B1883288 это место, где оно хранится в оперативной памяти, верно? Но если я сделаю это:

>>> eval('0x00000280B1883288')
2751757562504
>>> func
<function func at 0x00000280B1883288>
>>> 0x00000280B1883288
2751757562504

Я получаю только int, и если я пытаюсь вызвать его, я получаю ошибку, что int не вызывается. Но возможно ли вывести функцию из ее слота оперативной памяти, не вызывая func?

Это интересный вопрос о том, как работает Python, а не то, что я не знаю, как вызвать функцию, чтобы прояснить это.

1 Ответ

2 голосов
/ 11 октября 2019

Это зависит от CPython, но для этого можно использовать _ctypes:

import _ctypes

def di(obj_id):
    """ Inverse of id() function. """
    return _ctypes.PyObj_FromPtr(obj_id)

def func():
    return 42

func_id = id(func)
print(func)
print(hex(func_id))
print(di(func_id)())

Это адаптировано из Можно ли разыменовать переменные id?

PS Я также кратко экспериментировал с _ctypes.call_function(), но не очень далеко.

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