Я обрабатываю текст с помощью скрипта и использую разные подходы в зависимости от его размера: если текст большой, я обрабатываю его по частям (чанками), иначе - целиком. В предоставленном коде видно, что в обоих случаях выполняются почти одинаковые операции, и мне трудно понять, как вынести этот повторяющийся код в отдельную функцию, чтобы сделать его более чистым и понятным. Не подскажете, как это лучше реализовать, или можете порекомендовать статьи или книги на эту тему?
Существует несколько эффективных способов устранения дублирования кода. В вашем случае, когда вы обрабатываете текст по частям или целиком, можно использовать подход с вынесением общего кода в отдельные функции. Вот некоторые рекомендации: 1. **Создание функции для общей логики**: Выделите операции, которые выполняются в обоих случаях, в отдельную функцию. Она будет принимать необходимые параметры, такие как текст или части текста, и обработает их. Например: ```python def process_text(text): # Здесь помещаем общую логику обработки текста processed_text = text.lower() # Пример обработки # Другие операции return processed_text ``` Затем в вашем основном коде вы можете вызывать эту функцию: ```python if len(text) > threshold: for chunk in chunkify(text): result = process_text(chunk) # Обработка результата else: result = process_text(text) # Обработка результата ``` 2. **Использование параметров**: Если ваши подходы несколько отличаются в зависимости от размера текста, можно использовать параметры для настройки поведения обработчика. Например: ```python def process_text(text, mode='full'): if mode == 'chunk': # Специфическая обработка для чанков pass else: # Полная обработка pass return processed_text ``` 3. **Шаблоны проектирования**: Рассмотрите возможность применения шаблонов проектирования, таких как "Стратегия" или "Шаблонный метод", которые позволяют определить алгоритмы и их использование в зависимости от условий. 4. **Улучшение структуры кода**: Если приложение растет, стоит подумать о более структурированном подходе, например, выделить классы или модули, которые обрабатывают текст разными способами. ### Ресурсы для изучения Для глубокого понимания принципов устранения дублирования кода и других аспектов чистого кода, вот некоторые рекомендованные книги и статьи: 1. **"Чистый код" (Clean Code)** - Роберт Мартин (Robert C. Martin). Классическая книга о том, как писать чистый и понятный код. 2. **"Refactoring: Improving the Design of Existing Code"** - Мартин Фаулер (Martin Fowler). Книга, посвященная рефакторингу кода и улучшению его структуры. 3. **"The Pragmatic Programmer"** - Эндрю Хант и Дэвид Томас. Полезные идеи и советы по всему спектру разработки ПО. 4. **Статьи на сайте Martin Fowler** - [martinfowler.com](https://martinfowler.com). Много полезной информации о рефакторинге и чистом коде. Следуя этим рекомендациям и изучая указанные ресурсы, вы сможете значительно улучшить качество вашего кода и устранить дублирование.
Если правильно понял Ваш вопрос:
result_json = 0 def someth(a): answer = get_answer(text, tags_quantity=a) tmp_json = parse_answer(answer) result_json['summary_text'] = tmp_json['result'] result_json['tags'].extend(tmp_json['tags']) result_json['input_size'] = answer.input_size result_json['output_size'] = answer.output_size …………… if size > max_size: chunker = TextChunker(maxlen=max_size) for chunk in chunker.chunk(text): result_json = someth(3) else: result_json = someth(1) return result_json
Как вариант (>=Python3.10):
from typing import Dict, Any def process(answer, result_json: Dict[str, Any]) -> None: tmp_json = parse_answer(answer) result_json['summary_text'] += tmp_json['result'] result_json['tags'].extend(tmp_json['tags']) result_json['input_size'] += answer.input_size result_json['output_size'] += answer.output_size def handler(text: str, max_size: int) -> Dict[str, Any]: result_json = {'summary_text': '', 'tags': [], 'input_size': 0, 'output_size': 0} match len(text): case size if size > max_size: chunker = TextChunker(maxlen=max_size) for chunk in chunker.chunk(text): answer = get_answer(chunk, tags_quantity=1) process(answer, result_json) case _: answer = get_answer(text, tags_quantity=3) process(answer, result_json) return result_json