You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:57:02