Python 嵌套f字符串
多亏了,我最近发现新的也可以嵌套:Python 嵌套f字符串,python,python-3.x,string-formatting,python-3.6,f-string,Python,Python 3.x,String Formatting,Python 3.6,F String,多亏了,我最近发现新的也可以嵌套: >>> price = 478.23 >>> f"{f'${price:0.2f}':*>20s}" '*************$478.23' 或: 虽然我很惊讶这是可能的,但我不知道这有多实际,嵌套f字符串什么时候有用?这可以涵盖哪些用例 注意:PEP本身没有提到嵌套f字符串,但有一个问题。您可以将其用于动态性。例如,假设您将一个变量设置为某个函数的名称: func = 'my_func' 然后你可以写: f
>>> price = 478.23
>>> f"{f'${price:0.2f}':*>20s}"
'*************$478.23'
或:
虽然我很惊讶这是可能的,但我不知道这有多实际,嵌套f字符串什么时候有用?这可以涵盖哪些用例
注意:PEP本身没有提到嵌套f字符串,但有一个问题。您可以将其用于动态性。例如,假设您将一个变量设置为某个函数的名称:
func = 'my_func'
然后你可以写:
f"{f'{func}'()}"
这相当于:
'{}'.format(locals()[func]())
或者,相当于:
'{}'.format(my_func())
我不认为允许嵌套的格式化字符串文本(通过嵌套,我认为它的意思是
f'{f..“}'
)是仔细考虑可能的用例的结果,我更确信它是允许的,只是为了使它们符合规范
规范规定,它们*在括号内。还指出,格式化字符串文字实际上只是在运行时计算的表达式(请参阅和)。因此,只允许一个格式化字符串文本作为另一个格式化字符串文本中的表达式才有意义,禁止它将否定对Python表达式的完全支持
您无法找到文档中提到的用例(并且只能在测试套件中找到测试用例),这是因为这可能是实现的一个很好的(副)效果,而不是激发用例
实际上,有两个例外:不允许使用空表达式,lambda表达式必须用显式括号括起来。我想这是为了在同一行中传递格式参数,从而简化f字符串的使用 例如:
>>> import decimal
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}"
'result: 12.35'
当然,它允许程序员编写完全不可读的代码,但这不是目的:)事实上,我刚刚遇到了一些类似的东西(我认为),我想与大家分享一下 我的具体情况是一个大的脏sql语句,其中我需要有条件地具有一些非常不同的值,但一些fstring是相同的(也用于其他地方) 下面是我的意思的一个简单例子。不管怎样,我选择的列都是相同的(也用于其他地方的其他查询),但表名取决于组,而不是我可以在循环中执行的 当我有多个这样的参数时,每次都不得不在str2中包含
mycols=mycols
,感觉有点脏
我不确定这是否有效,但很高兴它能起作用。至于它有多像蟒蛇,我不太确定
mycols='col_a,col_b'
str1 = "select {mycols} from {mytable} where group='{mygroup}'".format(mycols=mycols,mytable='{mytable}',mygroup='{mygroup}')
group = 'group_b'
if group == 'group_a':
str2 = str1.format(mytable='tbl1',mygroup=group)
elif group == 'group_b':
str2 = str1.format(mytable='a_very_different_table_name',mygroup=group)
print(str2)
在一个宠物项目上工作时,我写了自己的DB库,从而偏离了方向。我发现的一件事是:
>>> x = dict(a = 1, b = 2, d = 3)
>>> z = f"""
UPDATE TABLE
bar
SET
{", ".join([ f'{k} = ?' for k in x.keys() ])} """.strip()
>>> z
'UPDATE TABLE
bar
SET
a = ?, b = ?, d = ? '
我也对此感到惊讶,老实说,我不确定我是否会在生产代码中做类似的事情,但我也说过我不会在生产代码中做很多其他事情。任何基本用例都需要一个字符串来完整描述要放在f字符串大括号中的对象
{}
。例如,您需要字符串来索引字典
因此,我最终在一个ML项目中使用了它,代码如下:
scores = dict()
scores[f'{task}_accuracy'] = 100. * n_valid / n_total
print(f'{task}_accuracy: {scores[f"{task}_accuracy"]}')
我发现嵌套在做三元组时很有用。你对可读性的看法会有所不同,但我发现这一行非常有用
logger.info(f"No program name in subgroups file. Using {f'{prg_num} {prg_orig_date}' if not prg_name else prg_name}")
因此,我的嵌套测试是:
- 价值是否被重用?(用于表达式重用的变量)
- 表达清楚吗?(不超过复杂性)
f“{f'${price:0.2f}”:*>20s\}”
可能与嵌套较旧的str.format
的目的完全相同:另一个很好的方法。我将把是否欺骗哈默的决定权留给你。@TigerhawkT3谢谢你的好例子!我不确定这些是直接复制品,但绝对相关-就结束而言..我将接受社区的任何决定。我也希望这里可能有一些特定于f字符串的东西。我们可能应该给这个主题一点时间和机会。不确定它是否值得回答,但现在金字塔更容易在一行中打印print(“\n”)。join(f'{a:{a}我刚才为计时器制作了这个怪物:f''a计时器已经为{f'{hrs:02d}:{mins:02d}:{secs:02d}设置了计时器,如果hrs>0,则为{f'{f'{min:02d}secs:02d}“if mins>0 else f'{secs}}'”
恐怕你是对的,完全同意。今天的投票结果出来了-明天会回来。谢谢。@alecxe我很确定一些关于f-string
嵌套的古怪事情会在某个时候在野外突然出现,不过:-)是的,我刚刚有一个案例需要嵌套f”…“
我自己也很高兴地使用了它,我不能在f字符串中加引号,更不用说其他f字符串了。我试过了,但没有成功。TypeError:'str'对象不可调用
这不是真的。f'{func}“
是一个字符串。你不能调用字符串。如果你陷入了这样的不安全的黑客行为,你可能正在寻找eval
。是的!str.format
一直支持这一点,例如“{0:.{1}f}”。format(math.pi,4)
是'3.1416'
。如果f-string不能支持这一点,那么它就太差劲了。您的示例没有显示嵌套的f-string,只显示了嵌套的花括号。“我编写了自己的DB库”哈哈哈:)是的,这很有趣,不,我也不会在生产中使用它:)@ChristopherMahan我几年前退休了,所以我有时间去探索一些不好的想法。如果你好奇的话,有一长串的功能缺失了,但这很好,因为我有时间实现它们或者抓拍并回到sqlalchemy。而不是使用它在{my_table}
第3行的格式中的my_table
中,您可以在字符串文本中使用{my_table}
。然后格式转换doub
logger.info(f"No program name in subgroups file. Using {f'{prg_num} {prg_orig_date}' if not prg_name else prg_name}")