Python: Как я могу изменить значение аргумента функции из внутреннего фрейма? - PullRequest
0 голосов
/ 23 января 2020

В приведенном ниже примере force должен изменить значение параметра x функции double. ValidateAndCast проверяет данный параметр и приводит его в соответствие. Таким образом, в этом случае, после возврата force, x должно быть 2, и, следовательно, возвращаемое значение double должно быть 4. Предположим, что все изменения выполняются в функции force.

Как мне этого добиться? До сих пор я изучал inspect и продолжу изучение.

def is_number(x):
  try:
    float(x)
    return True
  except:
    return False


def to_int(x):
  return int(float(x))

def double(x):
  force(x=ValidateAndCast(is_number, to_int))
  return x * 2

x = '2.54'
y = double(x)
print(y)

1 Ответ

0 голосов
/ 24 января 2020

Это решение работает для меня .

import ctypes
import inspect


def change():

  def apply(frame):
    frame.f_locals['x'] = 4
    ctypes.pythonapi.PyFrame_LocalsToFast(ctypes.py_object(frame), ctypes.c_int(1))

  calling_frame = inspect.stack()[1][0]
  apply(calling_frame)


def f(x):
  change()
  return x * 2


y = f(2)
print(y) # prints 8
...