Я пытаюсь создать функцию, которая обновляет данный CSV-файл (в качестве первого аргумента) и обновляет его с помощью данного объекта (в качестве второго аргумента). Он содержится в моем пакете 'utils' и будет вызываться из пользовательского интерфейса.
До сих пор я пытался написать четыре отдельные функции (это количество типов объектов, которые у меня сейчас есть), и каждая функция обновляет соответствующие файлы. иначе. Но это не очень многоразово и легко изменить в будущем, поэтому мне было интересно, есть ли лучший способ? Моя иерархия объектов выглядит следующим образом:
- Пользователь имеет два подкласса: Admin и Обычный
- Book - это отдельный класс, описывающий одну сущность книги
В настоящее время у меня есть:
import shutil
import csv
import Users as usr
import Book as bk
def update_file(path, change):
tempfile = NamedTemporaryFile(delete=False)
with open(path, 'rb') as old_file, tempfile:
reader = csv.reader(old_file, delimiter=',')
writer = csv.writer(tempfile, delimiter=',')
if isinstance(change, bk.Book):
# Code for extracting appropriate data to update based on the object type
elif isinstance(change, usr.User):
# Code for extracting appropriate data to update based on the object type
elif isinstance(change, usr.Admin):
# Code for extracting appropriate data to update based on the object type
elif isinstance(change, usr.Regular):
# Code for extracting appropriate data to update based on the object type
else:
print("Object type not recognised")
# Some error handling
for row in reader:
# Actual update code will be here
shutil.move(tempfile.name, path)
Эта функция будет вызываться в различных местах пользовательского интерфейса, что-то вроде этого :
update_file(utils.USERS_FILE_PATH, user_type_object)
update_file(utils.USERS_FILE_PATH, regular_user_type_object)
update_file(utils.USERS_FILE_PATH, admin_user_type_object)
update_file(utils.BOOKS_FILE_PATH, book_type_object)
После того, как я заполню пробелы с кодом извлечения, эта функция будет очень длинной и ужасной для обслуживания, но наличие четырех отдельных функций (и, возможно, больше, если я реализую новые типы объектов) выглядит как худшая идея.
Я также думал об использовании args и kwargs в этой функции, но не придумал, как это сделать без длинного списка if-elif операторов.
Есть ли лучший, более питонский c и более OOP способ сделать это?