How do I use Python to easily expand variables to strings?

前端 未结 4 1173
一个人的身影
一个人的身影 2021-02-05 07:52

What\'s a nice idiom to do this:

Instead of: print \"%s is a %s %s that %s\" % (name, adjective, noun, verb)

I want to be able to do something to th

相关标签:
4条回答
  • 2021-02-05 08:02

    use string.Template

    >>> from string import Template
    >>> t = Template("$name is a $adjective $noun that $verb")
    >>> t.substitute(name="Lionel", adjective="awesome", noun="dude", verb="snores")
    'Lionel is a awesome dude that snores'
    
    0 讨论(0)
  • 2021-02-05 08:04

    Since Python 3.6 you can now use this syntax, called f-strings, which is very similar to your suggestion 9 years ago

    0 讨论(0)
  • 2021-02-05 08:19

    For python 2 do:

    print name,'is a',adjective,noun,'that',verb
    

    For python 3 add parens:

    print(name,'is a',adjective,noun,'that',verb)
    

    If you need to save it to a string, you'll have to concatenate with the + operator and you'll have to insert spaces. print inserts a space at all the , unless there is a trailing comma at the end of the parameters, in which case it forgoes the newline.

    To save to string var:

    result = name+' is a '+adjective+' '+noun+' that '+verb
    
    0 讨论(0)
  • 2021-02-05 08:26
    "{name} is a {adjective} {noun} that {verb}".format(**locals())
    
    • locals() gives a reference to the current namespace (as a dictionary).
    • **locals() unpacks that dictionary into keyword arguments (f(**{'a': 0, 'b': 1}) is f(a=0, b=1)).
    • .format() is "the new string formatting", which can by the way do a lot more (e.g. {0.name} for the name attribute of the first positional argument).

    Alternatively, string.template (again, with locals if you want to avoid a redundant {'name': name, ...} dict literal).

    0 讨论(0)
提交回复
热议问题