Advertisement
Guest User

Untitled

a guest
Nov 15th, 2019
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.83 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. from typing import List
  3. import sys
  4. import re
  5. import argparse
  6.  
  7. # Общее замечание. Здесь цикл, который идет по строчкам, ищет совпадения и что-то выводит,
  8. # продублирован шесть раз. Дублирование кода -- это плохо. Надо постараться объединить
  9. # все эти циклы в один.
  10.  
  11. # Не указан тип возвращаемого значения.
  12. def parse_args(args_str):
  13.     parser = argparse.ArgumentParser()
  14.     parser.add_argument('pattern', type=str)
  15.     parser.add_argument('files', nargs='*')
  16.     parser.add_argument('-E', dest='regex', action='store_true')
  17.     parser.add_argument('-c', dest='count', action='store_true')
  18.     # Временная переменная не нужна, можно написать сразу return parser.parse_args(args_str)
  19.     args = parser.parse_args(args_str)
  20.     return args
  21.  
  22.  
  23. # Не указан тип возвращаемого значения.
  24. def print_with_files(files: List[str], file: str, line: str):
  25.     # Этой функции не обязательно знать список всех файлов.
  26.     # Лучше передавать сразу флаг, как форматировать.
  27.     if len(files) > 1:
  28.         print(f'{file}:{line}')
  29.     else:
  30.         print(line)
  31.  
  32.  
  33. # Не указан тип возвращаемого значения.
  34. def no_flags_in_stdin(pattern: str):
  35.     for line in sys.stdin.readlines():
  36.         line = line.rstrip('\n')
  37.         if pattern in line:
  38.             print(line)
  39.  
  40.  
  41. # Не указан тип возвращаемого значения.
  42. def no_flags_in_files(files: List[str], pattern: str):
  43.     for file in files:
  44.         # Названия file и file_name перепутаны.
  45.         with open(file, 'r') as file_name:
  46.             for line in file_name.readlines():
  47.                 line = line.rstrip('\n')
  48.                 if pattern in line:
  49.                     print_with_files(files, file, line)
  50.  
  51.  
  52. # Эта функция отличается от предыдущей только способом поиска в строке. Надо объединить в их в одну.
  53. # Не указан тип возвращаемого значения.
  54. # Параметры file и regex никак не используются внутри функции.
  55. def regex_in_files(files: List[str], file: str, line: str, pattern: str, regex: bool):
  56.     for file in files:
  57.         # Названия file и file_name перепутаны.
  58.         with open(file, 'r') as file_name:
  59.             for line in file_name.readlines():
  60.                 line = line.rstrip('\n')
  61.         if re.search(pattern, line):
  62.             print_with_files(files, file, line)
  63.  
  64.  
  65. # Эта функция отличается от no_flags_stdin() только способом поиска в строке.
  66. # Надо объединить в их в одну.
  67. # Не указан тип возвращаемого значения.
  68. def regex_in_stdin(pattern: str):
  69.     for line in sys.stdin.readlines():
  70.         line = line.rstrip('\n')
  71.         if re.search(pattern, line):
  72.             print(line)
  73.  
  74.  
  75. # Эта функция отличается от no_flags_stdin() только тем, что печатается. Надо объединить их в одну.
  76. # Не указан тип возвращаемого значения.
  77. def count_in_stdin(pattern: str):
  78.     # counter -- неудачное название. По нему непонятно, что именно считается.
  79.     counter = 0
  80.     for line in sys.stdin.readlines():
  81.         line = line.rstrip('\n')
  82.         if pattern in line:
  83.             counter += 1
  84.     print(counter)
  85.  
  86.  
  87. # Эта функция отличается от no_flags_in_files() только тем, что печатается.
  88. # Надо объединить их в одну.
  89. # Не указан тип возвращаемого значения.
  90. def count_in_files(files: List[str], pattern: str, count: bool):
  91.     # Этот if не нужен, потому что функция вызывается только когда count == True.
  92.     if count:
  93.         for file in files:
  94.             counter = 0
  95.             # Названия file и file_name перепутаны.
  96.             with open(file, 'r') as file_name:
  97.                 for line in file_name.readlines():
  98.                     line = line.rstrip('\n')
  99.                     if pattern in line:
  100.                         counter += 1
  101.                 # Хорошее решение передавать сразу counter вместо строки.
  102.                 # Только тогда надо сделать явное преобразование типов -- str(counter).
  103.                 print_with_files(files, file, counter)
  104.  
  105.  
  106. # Не указан тип возвращаемого значения.
  107. def lines_in_stdin(pattern: str, regex: bool, count: bool):
  108.     if count:
  109.         count_in_stdin(pattern)
  110.     elif regex:
  111.         regex_in_stdin(pattern)
  112.         # Не разобран случай, когда и count, и regex.
  113.     else:
  114.         no_flags_in_stdin(pattern)
  115.  
  116.  
  117. # Не указан тип возвращаемого значения.
  118. # Названия regex и count неудачные.
  119. # В переменных с таким названием ожидается увидеть какие-то значения, а не True/False.
  120. def file_in_files(files: List[str], pattern: str, regex: bool, count: bool):
  121.     if count:
  122.         # Зачем здесь передавать count, если мы уже проверили, что count == True?
  123.         count_in_files(files, pattern, count)
  124.     elif regex:
  125.         # Функция regex_in_files() получает пять обязательных аргументов,
  126.         # а тут передются только три.
  127.         # Зачем здесь передавать regex, если мы уже проверили, что regex == True?
  128.         regex_in_files(files, pattern, regex)
  129.     # Не разобран случай, когда и count, и regex.
  130.     else:
  131.         no_flags_in_files(files, pattern)
  132.  
  133.  
  134. # Не указан тип возвращаемого значения.
  135. def main(args_str: List[str]):
  136.     args = parse_args(args_str)
  137.     if args.files:
  138.         file_in_files(args.files, args.pattern, args.regex, args.count)
  139.     else:
  140.         lines_in_stdin(args.pattern, args.regex, args.count)
  141.  
  142.  
  143. if __name__ == '__main__':
  144.     # Зачем здесь переменная? Тем более, что функция возвращает None.
  145.     args = main(sys.argv[1:])
  146. # Не хватает пустой строки в конце файла.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement