36

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|

5 Answers 5

55

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)
Sign up to request clarification or add additional context in comments.

1 Comment

What if there is no 'self'? I.e. you're in global scope. Then I guess vars()['name'] has to be used, or is there a getattr fallback somehow?
43

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

1 Comment

Why not use setattr() ?
23

Also, there is the globals() function in Python which returns a dictionary with all the defined variables. You could also use something like this:

print globals()["myvar"]

Comments

18

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.

Comments

0

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

2 Comments

Have you attempted this answer on your own? Is there anything returnvar does that eval does not do?
I found the mistake and I have fixed it

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.