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专门创建类,属于过度设计——除非这个类本身还要封装其他相关业务逻辑,否则没必要。
推荐的最佳实践
- 模块级常量(首选)
把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代码风格规范,可读性和维护性拉满
- 类封装(按需使用)
如果后续有多个相关API调用,或者需要封装更多与该API相关的逻辑(比如请求超时设置、重试机制、响应数据解析),再考虑用类封装,将base_api作为类变量,同时把相关方法都放在类中——此时类的存在是为了聚合业务逻辑,而非单纯存储一个URL。
另外补充:你担心的内存和GC问题其实没必要,Python的字符串驻留机制会缓存字面量字符串,Method 1中的base_api每次调用都会复用同一个字符串对象,不会重复分配内存。开发中更应该关注代码的可读性、可维护性和规范度。
内容的提问来源于stack exchange,提问作者Simon L
相关产品推荐
相关产品推荐

