Python 3中f-string为何未设为默认格式?相较其他格式化方案有哪些缺陷?
为什么f-string没有被设为Python的默认字符串格式
核心原因是为了保障向后兼容性:Python历史版本中普通字符串始终按纯字面量规则解析,如果直接修改默认字符串为f-string格式,所有包含{}字符的存量历史代码都会出现运行错误,影响范围极广。
f-string作为默认格式的潜在弊端
- 安全风险极高
f-string会自动解析并执行字符串内部{}包裹的表达式,如果默认所有字符串都按f-string规则处理,外部传入的恶意字符串(比如用户提交的内容、接口返回的内容)只要包含可执行代码的表达式,就会直接在当前上下文运行,会造成大规模的远程代码执行漏洞,属于非常严重的安全隐患。 - 不必要的性能开销
普通纯字面量字符串不需要做额外解析,直接加载即可使用。如果默认启用f-string规则,所有字符串都需要先扫描是否包含{}字符,有符合规则的内容还要做表达式解析、求值,对于大量使用无占位符字符串的场景(比如日志输出、文本批量处理),会产生完全没必要的性能损耗。 - 增加普通字符串的编写成本
很多场景下字符串本身就需要包含{}字符,比如编写正则表达式、JSON模板、后续用于format()的通用模板等。如果f-string是默认格式,要输出单个{就必须转义为{{,单个}必须转义为}},反而会大幅降低开发效率。 - 不支持模板复用场景
很多业务场景需要先定义通用字符串模板,后续传入不同参数动态生成内容。如果默认启用f-string规则,字符串定义时就会直接解析内部的占位符表达式,要是当前上下文没有对应变量就会直接报错,根本无法作为模板留存到后续使用。
内容的提问来源于stack exchange,提问作者Gautam Sreekumar
相关产品推荐
相关产品推荐

