Como criar dinamicamente variáveis em Python
Se você está procurando criar dinamicamente variáveis nomeadas em Python, você quase certamente está fazendo isso errado. Python é uma linguagem muito dinâmica. Tudo em Python é um objeto de primeiro nível. Até mesmo funções são objetos. Porque tudo é um objeto, você pode atribuir atributos a qualquer coisa em Python. Mais python fornece uma estrutura de objetos muito flexível que permite que você faça dicionários como objetos muito facilmente, e depois estenda a sintaxe para se adequar às suas necessidades. I.E. while a dictionary is accessed like this:
- mydict['somekey']
You can quite easily extend the dict to enable you to write code that works like this:
- mydict.somekey
And then it can support both alternatives. Então isto deve lhe dar uma boa dica de como você pode realizar o que você quer sem tentar declarar dinamicamente variáveis nomeadas.
- class MyCustomDict(dict):
- def __getattr__(self,key):
- return self.get(key)
- def __setattr__(self,key,value):
- self[key] = value
- class GameState(MyCustomDict):
- pass
- class Coalition(MyCustomDict):
- pass
- def collect_coalition(coalition,player_count,prefix="v",player_id=1):
- for i in range(player_id,player_count+1):
- coalition_id = "%s%s"%(prefix,i)
- print coalition_id
- coalition[coalition_id] = int(raw_input("How much is worth the coalition v(%s)?"%(coalition_id)))
- for i in range(player_id,player_count+1):
- new_prefix = "%s%s"%(prefix,i)
- collect_coalition(coalition,player_count,new_prefix,i+1)
- def main():
- mydata = MyCustomDict()
- mydata.foo = "bar"
- print mydata['foo']
- mydata['foo'] = "baz"
- print mydata.foo
- print mydata['foo']
- state = GameState()
- player_count = 3
- #player_count = int(raw_input("How many players?"))
- state.coalition = Coalition()
- collect_coalition(state.coalition,player_count)
- print state.coalition
- print state.coalition.v1
- print state.coalition.v23
- print state.coalition.v123
- print state.coalition['v1']
- print state.coalition['v23']
- print state.coalition['v123']
- if __name__ == "__main__": main()
The getattr/setattr is really only the answer to the question you asked, how do I create dynamic variables. But the real answer to how do you generate the names you need in order to use a hash, is by using a recursive function, at least that is the simple way to do it. O exemplo acima ilustra ambos.