首页 > 解决方案 > 如何避免函数中的全局变量而不用类成员函数替换它们?

问题描述

# msg_process.py
#
global g_msg_mapping = {}

def process_msg_a(msg):
    global g_msg_mapping
    # update g_msg_mapping based on msg_a

def process_msg_b(msg):
    global g_msg_mapping
    # update g_msg_mapping based on msg_b

def process_msg(msg_line, msg_type):
    if msg_type == 'A':
        process_msg_a(msg_line)
    elif msg_type == 'B':
        process_msg_b(msg_line)

# main.py
# for each line in a file call msg_process.process_msg

可变全局变量在 Python 编程中不是好的做法。如果我把上面的函数换成类成员函数,就可以避免全局变量的使用。

问题:有什么优雅的方法可以避免在 Python 函数中使用全局变量而不将它们转换为class成员函数?

标签: pythonpython-3.x

解决方案


您可以将dict要更新的参数作为附加参数传递(见下文)。这样做的优点是函数可以处理比它们自己的类实例更通用的数据结构,但缺点是调用函数时有不明显的副作用(更新)。这可以通过战略命名来部分缓解。例如process_msg_a可以是update_map_with_msg_a

# msg_process.py
#

def process_msg_a(msg, msg_map):
    # update msg_map based on msg
    msg_map[msg['foo']] = msg['bar']

def process_msg_b(msg, msg_map):
    # update msg_map based on msg_b
    msg_map[msg['baz']] = msg['qux']

def process_msg(msg_line, msg_type, msg_map):
    if msg_type == 'A':
        process_msg_a(msg_line, msg_map)
    elif msg_type == 'B':
        process_msg_b(msg_line, msg_map)

g_msg_mapping = {}
process_msg(msg_line, msg_type, g_msg_mapping)

推荐阅读