如何避免函数中的全局变量而不用类成员函数替换它们?

2024-03-28 22:57:34 发布

您现在位置:Python中文网/ 问答频道 /正文

# 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成员函数?


Tags: 函数pyifondeftypelineupdate
2条回答

您可以修改不带全局语句的可变对象。你知道吗

在进程\u msg \u a或进程\u msg \u b上尝试类似的操作:

g_msg_mapping[index] = 'msg'

这样,您就不会重新分配全局值(g\u msg\u映射仍然是Dict),而只是修改Dict中的值

您可以将要更新的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)

相关问题 更多 >