如何使用f-string为从其他模块导入的字符串传递参数?
我有个settings.py文件,内容如下:
a_string='This string should contain {value} <<< here.'
接着在另一个.py文件里导入了这个模块,写了个mystring函数,但跑出来的结果完全不是我想要的:
import settings def mystring(value='100'): b_string=f'{settings.a_string}' return b_string print(mystring())
我本来期望输出是:"This string should contain 100 <<< here."
试过在settings.py里把字符串写成a_string="f'This string should contain {value} <<< here.'",没用;在函数里或者调用时折腾也不管用,总感觉漏了个很明显的点,求大佬指点!
哈哈,这个坑我刚学Python的时候也踩过!你现在的写法里,f'{settings.a_string}'其实只是把settings.a_string这个字符串原封不动地“套”了个f-string的壳,根本没去解析里面的{value}占位符。给你几个简单可行的解决办法:
方案1:用字符串的format()方法(最推荐)
这个是最直接也最安全的方式,settings.py不用改,还是原来的带占位符的普通字符串就行,在函数里调用format()传入参数就好:
import settings def mystring(value='100'): # 用format把value替换进去 b_string = settings.a_string.format(value=value) return b_string print(mystring()) # 输出:This string should contain 100 <<< here.
方案2:动态生成f-string
如果你执念于想用f-string的思路,可以把settings.py里的内容改成一个模板字符串,然后在函数里动态解析它:
- 先改
settings.py:
a_string_template = 'This string should contain {value} <<< here.'
- 然后在函数里用
eval()来生成f-string:
import settings def mystring(value='100'): # 把模板和变量结合成f-string再解析 b_string = eval(f"f'{settings.a_string_template}'") return b_string print(mystring())
⚠️ 注意:eval()会执行字符串里的代码,如果这个模板字符串是来自不可信的外部,会有安全风险,自己用的话没问题。
方案3:用string.Template类(最安全)
要是你担心eval的安全问题,Python标准库的string.Template是个更好的选择,只是要改一下占位符的格式:
- 修改
settings.py:
from string import Template a_string_template = Template('This string should contain $value <<< here.')
- 函数里这么写:
import settings def mystring(value='100'): b_string = settings.a_string_template.substitute(value=value) return b_string print(mystring())
这种方式专门用来处理模板替换,完全没有代码执行的风险,适合处理可能来自外部的模板内容。
内容的提问来源于stack exchange,提问作者0buz

