拒绝臃肿:长字符串编写的艺术与技巧

前言

日常开发中,总会遇到代码中需要写一下字符串字面量的地方,长的字符串在代码中总是显的格格不入,如何变得更加优雅呢?

遇到超长字符串写么写优雅

PEP8规范建议每行字符数不超过79,但实际编码过程中,会大于79,但也不会太长,否则影响阅读。看如下代码

ini 复制代码
s = "这个函数是一个私有方法,用于构建HTTP请求的有效载荷(payload)。它接受一个字典作为参数,其中包含发送HTTP请求所需的各种信息,如请求路径、请求方法、请求头、Cookie、认证信息等。函数将这些信息组装成一个字典,并返回该字典作为有效载荷。"

我们常用的方法应该是用\拆分为几段,像这样

makefile 复制代码
s = "这个函数是一个私有方法,用于构建HTTP请求的有效载荷(payload)。" \
    "它接受一个字典作为参数,其中包含发送HTTP请求所需的各种信息,如请求路径、请求方法、请求头、Cookie、认证信息等。" \
    "函数将这些信息组装成一个字典,并返回该字典作为有效载荷。"

接下来,就是重点了,有一种更加简单的办法,使用括号将字符串包起来,就可以随意这行了,像这样

makefile 复制代码
s = ("这个函数是一个私有方法,用于构建HTTP请求的有效载荷(payload)。"
     "它接受一个字典作为参数,其中包含发送HTTP请求所需的各种信息,如请求路径、请求方法、请求头、Cookie、认证信息等。"
     "函数将这些信息组装成一个字典,并返回该字典作为有效载荷。")

遇到多级缩进出现多行字符串怎么写优雅

在已经有缩进层级的代码里,插入字符串字面量,为了不让字符串包含缩进中的空格,我们需要这样写,像这样

ini 复制代码
def demo():
    config_content =  """env: test
test:
  host: 'https://test.example.com'
  account:
    user: 'admin'
    pwd: '123456'"""

但这样看着比较难受,破坏了缩进的视觉效果,那该如何做呢?当然,第一种办法可以将多行字符串提取为全局变量,当然还有另外一种办法,使用textwrap标准库解决,像这样

python 复制代码
from textwrap import dedent
def demo():
    config_content = dedent("""
    env: test
        test:
          host: 'https://test.example.com'
          account:
            user: 'admin'
            pwd: '123456'
            """)

该不该使用+=拼接字符串

我在实际写代码过程中,遇到字符串拼接一般都用"".join(),一般不使用+=,因为在我一直认为+=会很慢,那到底慢不慢呢?我们来测试一下

scss 复制代码
import timeit
​
WORDS = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r','s', 't', 'u', 'v', 'w', 'x', 'y', 'z'] * 25
# 定义测试函数
def string_concatenation():
    s = ''
    for word in WORDS:
        s += word
    return s
​
def string_concatenation_join():
    l = []
    for word in WORDS:
        l.append(word)
    return ''.join(l)
​
​
time_cost = timeit.timeit(string_concatenation)
time_cost_join = timeit.timeit(string_concatenation_join)
print("Time cost:", time_cost)
print("Time cost join:", time_cost_join)
​

这里我们使用内置模块timeit来测试代码的执行效率。在笔者的MAC笔记本上执行结果如下:

sql 复制代码
Time cost: 32.474184429
Time cost join: 36.23991483099999

看结果,+=居然还会快一些,所以该使用+=就使用吧,大部分场景中都不会有任何问题,上面的示例中可是默认执行了1000000次的。

最后

照着上面的方法改进代码后,代码变得清爽很多,你也可以试着优化一下,让自己的代码变得更优雅,更易阅读吧。

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
默_笙3 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
qq_426003963 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
长沙三为智能科技3 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
大勇前进3 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端