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

时间:2018-05-18 17:10:20

标签: python python-3.x

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

您可以在没有全局声明的情况下修改可变对象。

在process_msg_a或process_msg_b上尝试类似的东西:

g_msg_mapping[index] = 'msg'

这样你就不会重新分配全局值(g_msg_mapping仍然是同一个Dict),你只是修改了Dict的值。