Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- from typing import List
- import sys
- import re
- import argparse
- # Общее замечание. Здесь цикл, который идет по строчкам, ищет совпадения и что-то выводит,
- # продублирован шесть раз. Дублирование кода -- это плохо. Надо постараться объединить
- # все эти циклы в один.
- # Не указан тип возвращаемого значения.
- def parse_args(args_str):
- parser = argparse.ArgumentParser()
- parser.add_argument('pattern', type=str)
- parser.add_argument('files', nargs='*')
- parser.add_argument('-E', dest='regex', action='store_true')
- parser.add_argument('-c', dest='count', action='store_true')
- # Временная переменная не нужна, можно написать сразу return parser.parse_args(args_str)
- args = parser.parse_args(args_str)
- return args
- # Не указан тип возвращаемого значения.
- def print_with_files(files: List[str], file: str, line: str):
- # Этой функции не обязательно знать список всех файлов.
- # Лучше передавать сразу флаг, как форматировать.
- if len(files) > 1:
- print(f'{file}:{line}')
- else:
- print(line)
- # Не указан тип возвращаемого значения.
- def no_flags_in_stdin(pattern: str):
- for line in sys.stdin.readlines():
- line = line.rstrip('\n')
- if pattern in line:
- print(line)
- # Не указан тип возвращаемого значения.
- def no_flags_in_files(files: List[str], pattern: str):
- for file in files:
- # Названия file и file_name перепутаны.
- with open(file, 'r') as file_name:
- for line in file_name.readlines():
- line = line.rstrip('\n')
- if pattern in line:
- print_with_files(files, file, line)
- # Эта функция отличается от предыдущей только способом поиска в строке. Надо объединить в их в одну.
- # Не указан тип возвращаемого значения.
- # Параметры file и regex никак не используются внутри функции.
- def regex_in_files(files: List[str], file: str, line: str, pattern: str, regex: bool):
- for file in files:
- # Названия file и file_name перепутаны.
- with open(file, 'r') as file_name:
- for line in file_name.readlines():
- line = line.rstrip('\n')
- if re.search(pattern, line):
- print_with_files(files, file, line)
- # Эта функция отличается от no_flags_stdin() только способом поиска в строке.
- # Надо объединить в их в одну.
- # Не указан тип возвращаемого значения.
- def regex_in_stdin(pattern: str):
- for line in sys.stdin.readlines():
- line = line.rstrip('\n')
- if re.search(pattern, line):
- print(line)
- # Эта функция отличается от no_flags_stdin() только тем, что печатается. Надо объединить их в одну.
- # Не указан тип возвращаемого значения.
- def count_in_stdin(pattern: str):
- # counter -- неудачное название. По нему непонятно, что именно считается.
- counter = 0
- for line in sys.stdin.readlines():
- line = line.rstrip('\n')
- if pattern in line:
- counter += 1
- print(counter)
- # Эта функция отличается от no_flags_in_files() только тем, что печатается.
- # Надо объединить их в одну.
- # Не указан тип возвращаемого значения.
- def count_in_files(files: List[str], pattern: str, count: bool):
- # Этот if не нужен, потому что функция вызывается только когда count == True.
- if count:
- for file in files:
- counter = 0
- # Названия file и file_name перепутаны.
- with open(file, 'r') as file_name:
- for line in file_name.readlines():
- line = line.rstrip('\n')
- if pattern in line:
- counter += 1
- # Хорошее решение передавать сразу counter вместо строки.
- # Только тогда надо сделать явное преобразование типов -- str(counter).
- print_with_files(files, file, counter)
- # Не указан тип возвращаемого значения.
- def lines_in_stdin(pattern: str, regex: bool, count: bool):
- if count:
- count_in_stdin(pattern)
- elif regex:
- regex_in_stdin(pattern)
- # Не разобран случай, когда и count, и regex.
- else:
- no_flags_in_stdin(pattern)
- # Не указан тип возвращаемого значения.
- # Названия regex и count неудачные.
- # В переменных с таким названием ожидается увидеть какие-то значения, а не True/False.
- def file_in_files(files: List[str], pattern: str, regex: bool, count: bool):
- if count:
- # Зачем здесь передавать count, если мы уже проверили, что count == True?
- count_in_files(files, pattern, count)
- elif regex:
- # Функция regex_in_files() получает пять обязательных аргументов,
- # а тут передются только три.
- # Зачем здесь передавать regex, если мы уже проверили, что regex == True?
- regex_in_files(files, pattern, regex)
- # Не разобран случай, когда и count, и regex.
- else:
- no_flags_in_files(files, pattern)
- # Не указан тип возвращаемого значения.
- def main(args_str: List[str]):
- args = parse_args(args_str)
- if args.files:
- file_in_files(args.files, args.pattern, args.regex, args.count)
- else:
- lines_in_stdin(args.pattern, args.regex, args.count)
- if __name__ == '__main__':
- # Зачем здесь переменная? Тем более, что функция возвращает None.
- args = main(sys.argv[1:])
- # Не хватает пустой строки в конце файла.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement