如何让Python函数内的局部变量供其他函数调用?(Selenium场景)
优雅传递局部变量的几种实现方式
这个问题很常见,要在保持代码结构优雅的前提下传递current_charges,核心思路是让数据的生产者(pgi_auth)把需要的数据返回,然后在主流程里传递给消费者(send_email),这样既保证了函数的职责单一,又避免了不必要的耦合。下面给你几种实用的实现方式:
方案1:直接返回单一数据(适合简单场景)
让pgi_auth函数返回current_charges,然后在主逻辑中接收这个返回值,再传递给send_email。这是最直观且解耦的方式:
from selenium import webdriver import smtplib def pgi_auth(): # Selenium认证与HTML解析逻辑 driver = webdriver.Chrome() driver.get("https://your-target-site.com/auth") # 模拟登录操作(填写用户名、密码、点击登录等) # driver.find_element(...).send_keys(...) # driver.find_element(...).click() # 解析获取current_charges current_charges = driver.find_element("id", "charges-element").text driver.quit() return current_charges # 返回需要传递的数据 def send_email(charges_content): # 邮件发送逻辑,使用传入的charges_content构造内容 email_subject = "当前账单通知" email_body = f"您好,您当前的账单金额为:{charges_content}" # SMTP发送代码示例(根据实际邮箱服务商调整) # with smtplib.SMTP_SSL('smtp.example.com', 465) as server: # server.login('your-email@example.com', 'your-password') # server.sendmail('sender@example.com', 'recipient@example.com', f"Subject: {email_subject}\n\n{email_body}") print(f"邮件内容已准备:{email_body}") # 主执行流程 if __name__ == "__main__": try: charges_data = pgi_auth() if charges_data.strip(): # 校验数据有效性 send_email(charges_data) else: print("未获取到有效账单数据,无法发送邮件") except Exception as e: print(f"执行出错:{str(e)}")
优点:
- 函数职责清晰:
pgi_auth专注于认证和数据获取,send_email专注于邮件发送 - 解耦性强:两个函数之间仅通过参数传递数据,没有直接依赖
- 易于测试:可以单独测试每个函数的逻辑
方案2:返回结构化数据(适合多数据传递场景)
如果后续需要传递更多数据(比如账单到期日、用户信息等),可以用字典或者Python的dataclasses返回结构化数据,扩展性更好:
用字典传递
def pgi_auth(): driver = webdriver.Chrome() driver.get("https://your-target-site.com/auth") # 登录与解析逻辑 current_charges = driver.find_element("id", "charges-element").text due_date = driver.find_element("id", "due-date-element").text driver.quit() # 返回包含多个字段的字典 return { "current_charges": current_charges, "due_date": due_date } def send_email(bill_info): email_body = f"您好,您当前的账单金额为:{bill_info['current_charges']}\n到期日期:{bill_info['due_date']}" # 发送邮件逻辑... print(f"邮件内容:{email_body}") # 主流程 bill_data = pgi_auth() send_email(bill_data)
用dataclasses传递(更优雅的类型安全方案)
from dataclasses import dataclass from selenium import webdriver @dataclass class BillInfo: current_charges: str due_date: str def pgi_auth() -> BillInfo: driver = webdriver.Chrome() driver.get("https://your-target-site.com/auth") # 登录与解析逻辑 charges = driver.find_element("id", "charges-element").text due_date = driver.find_element("id", "due-date-element").text driver.quit() return BillInfo(current_charges=charges, due_date=due_date) def send_email(bill_info: BillInfo): email_body = f"您好,您当前的账单金额为:{bill_info.current_charges}\n到期日期:{bill_info.due_date}" # 发送邮件逻辑... print(f"邮件内容:{email_body}") # 主流程 bill_info = pgi_auth() send_email(bill_info)
优点:
- 类型清晰:
dataclasses提供了明确的类型提示,代码可读性更高 - 扩展性强:后续新增字段只需修改
BillInfo类,无需大幅调整函数逻辑 - 数据结构规范:避免了字典键名拼写错误的问题
避坑提示:尽量避免全局变量
不要为了图方便把current_charges设为全局变量,这会导致函数之间的耦合度升高,代码难以维护和测试,尤其是在后续功能扩展时,全局变量很容易引发意想不到的问题。
内容的提问来源于stack exchange,提问作者Piduna
相关产品推荐
相关产品推荐

