用字符串设置python对象/变量的名称

问题描述 投票:3回答:5

大多数人可能会说这是个坏主意。我想将字符串的内容用作变量的名称。我想完成可怕的事情:

s = 'x'
x = 1

变量名x来自(以某种方式?)来自字符串s

要回答“为什么?”,请说我有一个x的全局默认值,我希望在函数中覆盖该选项。但是:

x = 0
def f(**kw):
    print x
f(x=1)

打印0而不是1。如果我可以使用kw.keys()中的字符串来重新分配x(或任何其他全局设置的变量),那么我会很高兴。

我意识到这可以在x中重新分配f

x = 0
def f(x=x):
    print x
f(x=1)

但是对于我的命名空间中有许多变量,在某些时候可能要重写而不重写模块中的每个函数定义的情况,我想这样做。

python string function keyword argument-passing
5个回答
3
投票

签出exec

>>> print x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> s = 'x'
>>> exec(s + " = 1")
>>> print x
1 

另请参见:How can I assign the value of a variable using eval in python?

经过一些试验,这似乎也可行:

>>> print x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> s = 'x'
>>> globals()[s] = 1
>>> print x
1

1
投票

您应重新考虑使用global关键字(http://docs.python.org/2.7/reference/simple_stmts.html#the-global-statement

我也建议您同时查看Use of "global" keyword in Python

而且,正如promanow所建议的那样,使用全局可变对象可能是一种更好的方法。

但是,请记住,从维护的角度来看,拥有大量[[might修改或依赖于全局变量的代码是非常可怕的想法。小心踩。


1
投票
通过函数参数的赋值并不明显,因此不被认为是Pythonic的(Python不是C)。参见import this

我完成平面配置的廉价方法是通过全局局部指令:

In [1]: from functools import partial In [2]: config = partial(dict) In [3]: def f(x=None): ...: print x or config.x ...: In [4]: config.x = 'foo' In [5]: f() foo

达到此效果的目的

是]显而易见,易读,因此更易于维护。


1
投票
但是对于我的命名空间中有许多变量,在某些时候可能要重写而不重写模块中的每个函数定义的情况,我想这样做。

-1
投票
您可以使用以下解决方案:
© www.soinside.com 2019 - 2024. All rights reserved.