Как переписать код, чтобы три функции превратить в одну универсальную?

У меня повторяется 3 участка кода. Как можно переписать код, чтобы заменить три функции read_file превратить в одну универсальную?

import json
import threading

f1, f2, f3 = (None for i in range(3))


def read_file1():
    global f1

    name = '1'
    with open(name, 'r', encoding='utf-8') as read_file:
        f1 = json.load(read_file)


def read_file2():
    global f2

    name = '1'
    with open(name, 'r', encoding='utf-8') as read_file:
        f2 = json.load(read_file)


def read_file3():
    global f3

    name = '1'
    with open(name, 'r', encoding='utf-8') as read_file:
        f3 = json.load(read_file)


def f():
    global f1, f2, f3
    t1 = threading.Thread(target=read_file1)
    t1.start()
    t2 = threading.Thread(target=read_file2)
    t2.start()
    t3 = threading.Thread(target=read_file3)
    t3.start()

    t1.join()
    t2.join()
    t3.join()

Ответы (2 шт):

Автор решения: Kuchizu
import json
import threading

f1, f2, f3 = (None for i in range(3))

def read_file(f):
    name = '1'
    with open(name, 'r', encoding='utf-8') as read_file:
        globals()[f] = json.load(read_file)

def f():
    threading.Thread(target=read_file, args=('f1', )).start()
    threading.Thread(target=read_file, args=('f2', )).start()
    threading.Thread(target=read_file, args=('f3', )).start()
    ...
→ Ссылка
Автор решения: Pavel Mayorov

Ваша проблема в том, что вы не можете передать ссылку на глобальную переменную, чтобы записать туда чтобы то ни было. Значит, надо использовать для хранения что-то другое, ссылку на что вы передать можете.

Базовый вариант - объект:

class ThreadResult:
    def __init__(self):
        self.data = None

f1, f2, f3 = (ThreadResult() for i in range(3))

def read_file(store):
    name = '1'
    with open(name, 'r', encoding='utf-8') as read_file:
        store.data = json.load(read_file)

threading.Thread(target=read_file, args=(f1, )).start()
threading.Thread(target=read_file, args=(f2, )).start()
threading.Thread(target=read_file, args=(f3, )).start()

Если лень вводить свой класс - всегда можно воспользоваться чем-то стандартным, главное чтобы оно позволяло хранить данные и было изменяемым. Например, можно использовать список из одного элемента:

f1, f2, f3 = ([None] for i in range(3))

def read_file(store):
    name = '1'
    with open(name, 'r', encoding='utf-8') as read_file:
        store[0] = json.load(read_file)

Наконец, есть устаревший способ, который всё ещё имеет право на жизнь - наследование от Thread:

class ReaderThread(threading.Thread):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.result = None

    def run(self):
        self.result = read_file()

def read_file():
    name = '1'
    with open(name, 'r', encoding='utf-8') as read_file:
        return json.load(read_file)
→ Ссылка