You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python密码提醒脚本:如何跨函数复用多行消息字符串以避免代码重复?

复用密码提醒消息模板的优雅方案

这个问题很常见——当你有多个地方需要生成相似的消息时,重复代码不仅维护麻烦,还容易出错。这里有个更优雅的解决方案,能彻底复用你的消息模板,同时保持代码的可读性和灵活性:

核心思路:定义可复用的消息生成函数

把固定的消息结构抽离成一个函数,只传入动态变化的部分(用户信息和提示语),这样不管是短信还是邮件,都可以调用这个函数来生成完整的消息内容。

步骤1:定义消息模板函数

用Python的多行字符串(三重引号)来写固定的消息结构,比拼接多个f-string更清晰易读:

def generate_password_alert(user, prompt_content):
    """生成密码提醒/过期通知的消息内容"""
    return f"""Hello {user['Name']}, {prompt_content}

***To change your password, press CTRL + ALT + DEL and select change password***.


- MY COMPANY IT"""

步骤2:定义提示语常量(可选但推荐)

把动态变化的提示语抽离成常量,方便统一维护和修改:

# 即将过期用户的提示语模板
PASSWORD_NOTIFY_PROMPT = "you have {days} days left to reset your password."
# 已过期用户的提示语
PASSWORD_EXPIRED_PROMPT = "your password has expired, please change it asap to avoid any issues that could occur with your account."

步骤3:在短信函数中复用模板

现在你的send_sms函数可以大幅简化,完全消除重复代码:

def send_sms():
    client = Client(twilio_account_sid, twilio_auth_token)
    
    # 处理即将过期的用户
    for user in notify_users:
        # 填充提醒提示语
        prompt = PASSWORD_NOTIFY_PROMPT.format(days=user['days'])
        # 生成完整消息
        message_body = generate_password_alert(user, prompt)
        # 发送短信
        message = client.messages.create(
            to=user['Number'],
            from_=twilio_from_phone_number,
            body=message_body
        )
        print(message.sid)
    
    # 处理已过期的用户
    for user in expired_users:
        # 生成完整消息
        message_body = generate_password_alert(user, PASSWORD_EXPIRED_PROMPT)
        # 发送短信
        message = client.messages.create(
            to=user['Number'],
            from_=twilio_from_phone_number,
            body=message_body
        )
        print(message.sid)

步骤4:在邮件函数中复用同样的模板

邮件发送函数也可以直接调用同一个模板函数,彻底避免重复编写消息内容:

def send_emails():
    for user in notify_users:
        prompt = PASSWORD_NOTIFY_PROMPT.format(days=user['days'])
        email_text = generate_password_alert(user, prompt)
        return requests.post(
            "https://api.mailgun.net/v3/MYDOMAIN/messages",
            auth=("api", "MAILGUN_API_KEY"),
            data={
                "from": "IT <mailgun@MYDOMAIN>",
                "to": notify_list,
                "subject": "Password Reminder",
                "text": email_text
            }
        )

def send_exp_emails():
    for user in expired_users:
        email_text = generate_password_alert(user, PASSWORD_EXPIRED_PROMPT)
        return requests.post(
            "https://api.mailgun.net/v3/MYDOMAIN/messages",
            auth=("api", "MAILGUN_API_KEY"),
            data={
                "from": "IT <mailgun@MYDOMAIN>",
                "to": expired_list,
                "subject": "Password Reminder",
                "text": email_text
            }
        )

为什么这个方案更好?

  • 单一数据源:所有消息都来自同一个模板,以后要修改内容(比如公司名称、修改密码的步骤),只需要改generate_password_alert函数,不用在4个地方分别修改。
  • 可读性更强:把消息结构和动态数据分开,代码逻辑更清晰,新人接手也能快速理解。
  • 扩展性高:如果以后要加新的提醒类型(比如只剩1天过期),只需要新增一个提示语常量,不用重写整个消息结构。

内容的提问来源于stack exchange,提问作者troy

火山引擎 最新活动