我试图将用户的输入输入到变量中,但我希望它分配一个已经定义的不同变量,而不是字符串、浮点数或整数。伪ish示例:
xy = 23
a = raw_input("Enter a variable") xy
print (a)
23
是的,这可以通过 if 变量来控制,但对于许多变量,我相信这不是很实用?我打字没问题,只是想知道这不是不好的做法吗?
您可以使用globals()
获取包含全局命名空间或locals()
本地命名空间中所有变量的字典:
>>> xy = 23
>>> a = globals()[raw_input("Enter a variable ")]
Enter a variable xy
>>> print (a)
23
>>> globals()
{'a': 23, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None
, 'xy': 23, '__name__': '__main__', '__doc__': None}
有关他们的更多信息。在顶层,两者都将返回相同的 dict,但在函数内部使用时可以看出区别:
>>> def foo(x):
... print globals()
... print locals()
...
>>> foo(10)
{'a': 23, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None
, 'xy': 23, '__name__': '__main__', 'foo': <function foo at 0x00BC5FB0>, '__doc_
_': None}
{'x': 10}
请注意,此技术不涉及eval
任何方式,因此如果用户尝试输入恶意输入,它只会引发keyError
. 但是,根据您计划对变量执行的操作,仍然可能存在一些安全风险(从这个意义上说,使用locals()
更安全,因为您可以控制可以通过这种方式访问的精确变量集)。
你在寻找这样的东西吗?
xy = 23
a = eval(raw_input("Enter a variable"))
print (a)
在用户输入未知变量的情况下添加检查的任务留给读者......
还要注意这种方法的潜在安全问题。一种更安全的方法是通过定义应该使用的特定dict
s来限制评估范围。eval
阅读更多内容help(eval)
。
只需将您的 var 保存在字典中,它也可能是最安全的:
In [52]: d={'x':1,'y':2,'z':3}
In [53]: a=d.get(raw_input('enter var'),None)
例子:
In [57]: a=d.get(raw_input('enter var: '),None)
enter var: y
In [58]: print a
2
In [59]: a=d.get(raw_input('enter var: '),None) # You can specify a default value
enter var: Foo
In [60]: print a
None