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




