Как переписать код, чтобы три функции превратить в одну универсальную?
У меня повторяется 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)