繁体   English   中英

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

[英]How to get/set local variables of a function (from outside) in Python?

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

def sample_func():
    a = 78
    b = range(5)
    #c = a + b[2] - x

我的问题是:

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

提前致谢。

编辑

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

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

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

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

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()

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

我不确定你的用例是什么,但这可能会更好地作为一个班级。 您可以定义__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

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

函数运行时函数的局部变化,因此在函数未运行时访问函数的意义不大。

不确定这是不是你的意思,但由于函数是Python中的对象,你可以将变量绑定到一个函数对象并从'outside'访问它们:

def fa():
    print 'x value of fa() when entering fa(): %s' % fa.x
    print 'y value of fb() when entering fa(): %s' % fb.y
    fa.x += fb.y
    print 'x value of fa() after calculation in fa(): %s' % fa.x
    print 'y value of fb() after calculation in fa(): %s' % fb.y
    fa.count +=1


def fb():
    print 'y value of fb() when entering fb(): %s' % fb.y
    print 'x value of fa() when entering fa(): %s' % fa.x
    fb.y += fa.x
    print 'y value of fb() after calculation in fb(): %s' % fb.y
    print 'x value of fa() after calculation in fb(): %s' % fa.x
    print 'From fb() is see fa() has been called %s times' % fa.count


fa.x,fb.y,fa.count = 1,1,1

for i in range(10):
    fa()
    fb()

如果我非常错误,请原谅我...我是Python和编程初学者自己......

期望函数中的变量由外部函数设置在调用该函数之前是如此糟糕的设计,以至于我可以推荐的唯一真正的答案是改变设计。 期望在运行之前设置其内部变量的函数是无用的。

所以你要问的真正问题是为什么这个函数期望x被定义在函数之外? 函数使用的原始程序是否设置了一个函数可以访问的全局变量? 如果是这样,那么它可能就像向该函数的原始作者建议他们改为允许x作为参数传递一样容易。 样本函数的简单更改将使代码在以下两种情况下都起作用:

def sample_func(x_local=None):
  if not x_local:
    x_local = x
  a = 78
  b = range(5)
  c = a + b[2] - x_local

这将允许函数以您希望的方式接受主函数中的参数,但它不会破坏其他程序,因为如果函数没有给出任何参数,它仍将使用全局定义的x。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM