Convert a string to preexisting variable names
Question:
How do I convert a string to the variable name in Python?
For example, if the program contains a object named self.post
that contains a variable named, I want to do something like:
somefunction("self.post.id") = |Value of self.post.id|
Answers:
As referenced in Stack Overflow question Inplace substitution from ConfigParser, you’re looking for eval()
:
print eval('self.post.id') # Prints the value of self.post.id
Note: do not use eval in any case where you are getting the name to look up from user entered input. For example, if this comes from a web page, there is nothing preventing anyone from entering:
__import__("os").system("Some nasty command like rm -rf /*")
as the argument. Better is to limit to well-defined lookup locations such as a dictionary or instance using getattr(). For example, to find the “post” value on self, use:
varname = "post"
value = getattr(self, varname) # Gets self.post
Similarly to set it, use setattr():
value = setattr(self, varname, new_value)
To handle fully qualified names, like “post.id”, you could use something like the below functions in place of getattr() / setattr().
def getattr_qualified(obj, name):
for attr in name.split("."):
obj = getattr(obj, attr)
return obj
def setattr_qualified(obj, name, value):
parts = name.split(".")
for attr in parts[:-1]:
obj = getattr(obj, attr)
setattr(obj, parts[-1], value)
You could do something like what Geo recommended, or go with:
>>> wine = 'pinot_noir'
>>> vars()[wine] = 'yum'
>>> pinot_noir
'yum'
Note: vars() and globals() are the same, I’m just used to using vars()
I’m surprised nobody called me out on this! Anyway, it’s vars()
and locals()
that are the same.
Use this
var="variable name"
def returnvar(string):
exec(f"""global rtn
rtn={string}""")
return rtn
var will be your string and run returnvar(var) will to return variable
How do I convert a string to the variable name in Python?
For example, if the program contains a object named self.post
that contains a variable named, I want to do something like:
somefunction("self.post.id") = |Value of self.post.id|
As referenced in Stack Overflow question Inplace substitution from ConfigParser, you’re looking for eval()
:
print eval('self.post.id') # Prints the value of self.post.id
Note: do not use eval in any case where you are getting the name to look up from user entered input. For example, if this comes from a web page, there is nothing preventing anyone from entering:
__import__("os").system("Some nasty command like rm -rf /*")
as the argument. Better is to limit to well-defined lookup locations such as a dictionary or instance using getattr(). For example, to find the “post” value on self, use:
varname = "post"
value = getattr(self, varname) # Gets self.post
Similarly to set it, use setattr():
value = setattr(self, varname, new_value)
To handle fully qualified names, like “post.id”, you could use something like the below functions in place of getattr() / setattr().
def getattr_qualified(obj, name):
for attr in name.split("."):
obj = getattr(obj, attr)
return obj
def setattr_qualified(obj, name, value):
parts = name.split(".")
for attr in parts[:-1]:
obj = getattr(obj, attr)
setattr(obj, parts[-1], value)
You could do something like what Geo recommended, or go with:
>>> wine = 'pinot_noir'
>>> vars()[wine] = 'yum'
>>> pinot_noir
'yum'
Note: vars() and globals() are the same, I’m just used to using vars()
I’m surprised nobody called me out on this! Anyway, it’s vars()
and locals()
that are the same.
Use this
var="variable name"
def returnvar(string):
exec(f"""global rtn
rtn={string}""")
return rtn
var will be your string and run returnvar(var) will to return variable