如何从字符串中获取format()方法的变量名

10 投票
6 回答
10627 浏览
提问于 2025-04-18 01:07

假设我有这一行代码:

"My name is {name}".format(name="qwerty")

我知道这个变量的名字是 name,所以我可以给它赋值。可是如果 {} 里面的内容总是变化,比如这样:

"My name is {name}"
"My name is {n}"
"My name is {myname}"

我想要能够做到这一点:

"My name is {*}".format(*=get_value(*))

其中 * 是放在 {} 里面的任何单词。

希望我说得清楚。


补充说明:

def get_value(var):
    return mydict.get(var)

def printme(str):
    print str.format(var1=get_value(var1), var2=get_value(var2))

printme("my name is {name} {lastname}")
printme("your {gender} is a {sex}")

有了这个,我就不能在 printme 函数里面硬编码任何变量。

6 个回答

-1

或者你可以用一个函数来替代:

def format_string(name):
    return "My name is {name}".format(name="qwerty")

然后调用这个函数:

format_string("whatever")
0

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在程序里使用它。这就像你从冰箱里拿出食材,然后用它们做饭一样。

有些时候,数据可能会有点复杂,或者我们需要从多个地方获取数据。这就像你需要从不同的超市买不同的食材,才能做出一顿丰盛的晚餐。

在这个过程中,我们可能会遇到一些问题,比如数据格式不对,或者数据不完整。这就像你在做饭时发现缺少某种调料,可能会影响最后的味道。

为了避免这些问题,我们可以提前检查一下数据,确保它们都是正确的,这样在使用的时候就不会出错了。

总之,处理数据就像做饭一样,需要仔细准备,确保每一步都做对,这样才能做出美味的菜肴。

def get_arg(yourstring):
    arg_list = []
    pin = False
    for ch in yourstring:
        if ch == "{":
            pin = True
        elif ch == "}":
            pin = False
            arg_list.append(text)
            text = ""
        elif pin:
            text +=ch
    return arg_list
1

你可以用变量来代替 name="querty"

name1="This is my name";

>>"My name is {name}".format(name=name1)

输出结果:

'My name is abc'

再举个例子,

a=["A","B","C","D","E"]
>>> for i in a:
...     print "My name is {name}".format(name=i)

输出结果:

My name is A
My name is B
My name is C
My name is D
My name is E
3

Python 3.8 版本增加了一个很棒的功能,叫做 f-strings,来解决这个问题:

my_var = 123
print(f"{my_var = }")

这个代码会输出

my_var = 123
41

你可以使用 string.Formatter() 自己解析这个格式,来列出所有的引用:

from string import Formatter

names = [fn for _, fn, _, _ in Formatter().parse(yourstring) if fn is not None]

示例:

>>> from string import Formatter
>>> yourstring = "My name is {myname}"
>>> [fn for _, fn, _, _ in Formatter().parse(yourstring) if fn is not None]
['myname']

你还可以创建一个 Formatter 的子类,做一些更复杂的事情;比如,Formatter.get_field() 方法会被调用来处理每一个解析出来的字段名,这样子类就可以更努力地找到合适的对象来使用。

撰写回答