更新具有预定义值的locals()

时间:2014-02-21 14:27:06

标签: python

考虑以下示例:

def main():
  a = 'predefined'

  variables = {'a':'dynamic'}
  locals().update(variables)

  print a

if __name__ == '__main__':
    main()

运行脚本时,我希望看到:

dynamic

但是我看到了

predefined

为什么呢?我怎样才能获得动态值?

更新

我之所以问:我有一个程序需要很多输入参数,并且变量名称很长。我希望只需“解压缩”argparse解析器在locals().update(...)

的一次调用中收到的任何内容
def main():
  a = 'predefined'
  parser = argparse.ArgumentParser(description='My program')
  parser.add_argument('-a', type=int, default=a,  required=False);

  # Hoping to avoid typing lines like the following for every parameter:
  # a = parser.parse_args().a

  input_variables = vars(parser.parse_args())
  locals().update(input_variables)

  # Process stuff using the parameter names directly, e.g. 
  print a

2 个答案:

答案 0 :(得分:6)

the locals documentation中提及:

  

注意:不应修改此词典的内容;变化   可能不会影响使用的本地和自由变量的值   解释

AFAIK,没有可靠的方法来定义/更改局部变量。

答案 1 :(得分:0)

您想在locals()中创建变量吗?我建议创建一个空对象并将变量作为obj.var_name访问。它几乎与var_name一样可读,并且比exec的所有游戏都要简单得多。

from copy import copy


class Empty(object):
    pass


def main():
    a = 'predefined'
    b = 'predefined'
    loc = copy(locals())
    variables = {'a':'dynamic'}
    loc.update(variables)
    obj = Empty()
    for k, v in loc.items(): #iteritems for Python 2
        setattr(obj, k, v)

    print(obj.a, obj.b) # print statement for Python 2
相关问题