Python で可変変数を実現するにはどうすればよいですか?
たとえば、ここに詳細な手動エントリがあります:変数変数
これは一般的に悪い考えだと聞いていますが、これは PHP のセキュリティ ホールです。本当?
Python で可変変数を実現するにはどうすればよいですか?
たとえば、ここに詳細な手動エントリがあります:変数変数
これは一般的に悪い考えだと聞いていますが、これは PHP のセキュリティ ホールです。本当?
これを行うために辞書を使用できます。ディクショナリは、キーと値のストアです。
>>> dct = {'x': 1, 'y': 2, 'z': 3}
>>> dct
{'y': 2, 'x': 1, 'z': 3}
>>> dct["y"]
2
変数キー名を使用して、セキュリティ リスクなしで変数変数の効果を得ることができます。
>>> x = "spam"
>>> z = {x: "eggs"}
>>> z["spam"]
'eggs'
次のようなことを考えている場合
var1 = 'foo'
var2 = 'bar'
var3 = 'baz'
...
リストは辞書よりも適切かもしれません。リストは、オブジェクトの順序付けられたシーケンスを整数インデックスで表します。
lst = ['foo', 'bar', 'baz']
print(lst[1]) # prints bar, because indices start at 0
lst.append('potatoes') # lst is now ['foo', 'bar', 'baz', 'potatoes']
順序付きシーケンスの場合、リストは整数キーの辞書よりも便利です。リストは、インデックス順での反復、スライス、append
および辞書を使用した面倒なキー管理を必要とするその他の操作をサポートするためです。
組み込みgetattr
関数を使用して、オブジェクトの属性を名前で取得します。必要に応じて名前を変更します。
obj.spam = 'eggs'
name = 'spam'
getattr(obj, name) # returns 'eggs'
可変変数を使用したいときはいつでも、おそらく辞書を使用する方がよいでしょう。だから書く代わりに
$foo = "bar"
$$foo = "baz"
あなたが書く
mydict = {}
foo = "bar"
mydict[foo] = "baz"
このようにして、以前に存在していた変数を誤って上書きすることはなく (これはセキュリティの側面です)、異なる「名前空間」を持つことができます。
辞書の代わりに collections モジュールからも使用できるためnamedtuple
、アクセスが容易になります。
例えば:
# using dictionary
variables = {}
variables["first"] = 34
variables["second"] = 45
print(variables["first"], variables["second"])
# using namedtuple
Variables = namedtuple('Variables', ['first', 'second'])
vars = Variables(34, 45)
print(vars.first, vars.second)
その動作を実現するにはglobals()
、組み込みメソッドを使用する必要があります。
def var_of_var(k, v):
globals()[k] = v
print variable_name # NameError: name 'variable_name' is not defined
some_name = 'variable_name'
globals()[some_name] = 123
print(variable_name) # 123
some_name = 'variable_name2'
var_of_var(some_name, 456)
print(variable_name2) # 456
私は質問に答えています:文字列で名前が指定された変数の値を取得する方法は? これは、この質問へのリンクを含む複製として閉じられています。
問題の変数がオブジェクトの一部(たとえば、クラスの一部)である場合、正確にそれを達成するための便利な関数は、、、hasattr
およびgetattr
ですsetattr
。
たとえば、次のようにすることができます。
class Variables(object):
def __init__(self):
self.foo = "initial_variable"
def create_new_var(self,name,value):
setattr(self,name,value)
def get_var(self,name):
if hasattr(self,name):
return getattr(self,name)
else:
raise("Class does not have a variable named: "+name)
次に、次のことができます。
v = Variables()
v.get_var("foo")
「初期変数」
v.create_new_var(v.foo,"is actually not initial")
v.initial_variable
「実際にはイニシャルではありません」