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

Python中避免静态全局变量的最佳实践?API调用场景解惑

多层嵌套函数中API基础URL的最佳处理方式

我用Python开发程序时遇到一个场景:有个嵌套在多层函数里的api_call_function需要频繁调用。如果把base_api作为参数传递,得经过好几个函数层级;又担心每次调用时定义base_api变量会消耗内存和GC时间,所以我想到了三种实现方式:

Method 1

def api_call_function(player_name):
    base_api = "https://secure.runescape.com/m=hiscore_oldschool/index_lite.ws?player="

    api_call = requests.get(base_api+player_name)

    return api_call.text

Method 2

def api_call_function(player_name):
    api_call = requests.get("https://secure.runescape.com/m=hiscore_oldschool/index_lite.ws?player="+player_name)
    return api_call.text

Method 3

class Program:
    base_api = "https://secure.runescape.com/m=hiscore_oldschool/index_lite.ws?player="

    def api_call_function(player_name):
        api_call = requests.get(Program.base_api+player_name)
        return api_call.text

请问Method 2算不算不良实践?这种场景下的最佳实践是什么?


分析与最佳实践

先逐个分析三种方式的问题:

  • Method 1:每次调用函数时定义base_api,但Python对字面量字符串有驻留机制,这类固定短字符串会被缓存,不会重复分配内存,GC开销可以忽略。但把固定URL写在函数内部,后续修改时需要深入函数代码,维护性较差。
  • Method 2:直接把URL拼接逻辑写在requests.get的参数里,可读性差,拼接逻辑和API调用耦合在一起,后续修改URL或调整拼接规则时,容易在长字符串中出错,属于不够规范的实践。
  • Method 3:用类静态变量存储URL,虽然解决了复用问题,但如果只是为了存一个URL专门创建类,属于过度设计——除非这个类本身还要封装其他相关业务逻辑,否则没必要。

推荐的最佳实践

  1. 模块级常量(首选)
    把base_api定义在模块顶部作为常量(遵循PEP8规范,用大写命名),这样整个模块内的函数都能直接访问,无需层层传参,也不用额外的类或重复定义:
BASE_API = "https://secure.runescape.com/m=hiscore_oldschool/index_lite.ws?player="

def api_call_function(player_name):
    # 建议用f-string拼接,比+更清晰
    api_call = requests.get(f"{BASE_API}{player_name}")
    return api_call.text

这种方式的优势:

  • 常量仅初始化一次,内存占用极低,完全无需担心GC问题
  • URL集中管理,修改时只需改动模块顶部的常量
  • 符合Python代码风格规范,可读性和维护性拉满
  1. 类封装(按需使用)
    如果后续有多个相关API调用,或者需要封装更多与该API相关的逻辑(比如请求超时设置、重试机制、响应数据解析),再考虑用类封装,将base_api作为类变量,同时把相关方法都放在类中——此时类的存在是为了聚合业务逻辑,而非单纯存储一个URL。

另外补充:你担心的内存和GC问题其实没必要,Python的字符串驻留机制会缓存字面量字符串,Method 1中的base_api每次调用都会复用同一个字符串对象,不会重复分配内存。开发中更应该关注代码的可读性、可维护性和规范度。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:50:40