ユーザーから変数への入力を取得しようとしていますが、文字列、浮動小数点数、または整数の代わりに、既に定義されている別の変数を割り当てたいです。疑似的な例:
xy = 23
a = raw_input("Enter a variable") xy
print (a)
23
はい、これはif変数で制御できますが、多くの変数ではこれはあまり実用的ではないと思いますか? 悪い習慣ではないかと思って入力するのに問題はありませんか?
グローバル名前空間またはローカル名前空間globals()
のすべての変数を含む dict を取得するために使用できます。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()
は、この方法でアクセスできる変数の正確なセットを制御できるため、使用する方が安全です)。
変数を dict に保持するだけで、おそらく最も安全です。
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
このようなものをお探しですか?
xy = 23
a = eval(raw_input("Enter a variable"))
print (a)
ユーザーが未知の変数を入力した場合にチェックを追加するタスクは、リーダーに任されています...
また、このアプローチの潜在的なセキュリティ上の問題にも注意してください。より安全な方法は、使用する特定dict
の を定義して評価範囲を制限するeval
ことです。詳しくは をご覧くださいhelp(eval)
。