如何在Python中获取/设置函数的局部变量(从外部)?

msh*_*yem 10 python

如果我有一个函数(在Python 2.5.2中),如:

def sample_func():
    a = 78
    b = range(5)
    #c = a + b[2] - x
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 如何在使用函数内部的locals()的情况下从外部获取函数的局部变量(a,b)?(一种反思)
  2. 是否可以从外部设置局部变量(比如说x),以便注释行有效?(我知道这听起来很奇怪).

提前致谢.

编辑:

每个人都在要求用例.但这是一个奇怪的情况.(别怪我,我没有创造它).这是场景:

  1. 我有一个包含python函数的加密python源文件.
  2. AC扩展模块对其进行解密并在内存中构建该功能.
  3. 主python程序首先使用该加密文件位置调用C扩展.
  4. 然后主程序调用内存中构建的函数(通过C扩展)
  5. 但是主程序需要知道该函数的局部变量(不要问我为什么,这不是我)
  6. 对于某些(该死的)原因,主程序也需要设置一个变量(最奇怪)

Gle*_*ard 16

没有.没有运行的功能没有本地人; 它只是一个功能.询问如何在函数未运行时修改函数的本地函数,就像询问如何在程序未运行时修改程序的堆.

但是,如果你真的想要,你可以修改常量.

def func():
    a = 10
    print a

co = func.func_code
modified_consts = list(co.co_consts)
for idx, val in enumerate(modified_consts):
    if modified_consts[idx] == 10: modified_consts[idx] = 15

modified_consts = tuple(modified_consts)

import types
modified_code = types.CodeType(co.co_argcount, co.co_nlocals, co.co_stacksize, co.co_flags, co.co_code, modified_consts, co.co_names, co.co_varnames, co.co_filename, co.co_name, co.co_firstlineno, co.co_lnotab)
modified_func = types.FunctionType(modified_code, func.func_globals)
# 15:
modified_func()
Run Code Online (Sandbox Code Playgroud)

这是一个黑客攻击,因为没有办法知道co.co_consts中的哪个常量是哪个; 这使用了一个标记值来计算出来.根据您是否可以足够约束您的用例,这可能就足够了.

  • 只是一个小更新,在 Python3 中,“func_code”已更新为“__code__”。 (3认同)

Joh*_*uhy 8

我不确定你的用例是什么,但这可能会更好地作为一个班级.您可以定义__call__方法以使类的行为类似于函数.

例如:

>>> class sample_func(object):
...     def __init__(self):
...         self.a = 78
...         self.b = range(5)
...     def __call__(self):
...         print self.a, self.b, self.x
... 
>>> f = sample_func()
>>> print f.a
78
>>> f.x = 3
>>> f()
78 [0, 1, 2, 3, 4] 3
Run Code Online (Sandbox Code Playgroud)

(这是基于您的玩具示例,因此代码没有多大意义.如果您提供更多详细信息,我们可能会提供更好的建议)