Convert a string to preexisting variable names

前端 未结 4 2114
暗喜
暗喜 2020-12-07 16:01

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,

相关标签:
4条回答
  • 2020-12-07 16:17

    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.

    0 讨论(0)
  • 2020-12-07 16:21

    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)
    
    0 讨论(0)
  • 2020-12-07 16:22

    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"]
    
    0 讨论(0)
  • 2020-12-07 16:34

    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
    
    0 讨论(0)
提交回复
热议问题