рдкрд╛рдпрдерди рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реИ рдЬреЛ рд╕реНрдЯреИрдВрдб-рдЕрд▓реЛрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рд╣реИред рдПрдХ рд╕рдорд╛рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдИ рджрд╕рд┐рдпреЛрдВ рдпрд╛ рд╕реИрдХрдбрд╝реЛрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреА рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдмрд╕ рд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдЧрд▓реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдХрд╣рддреЗ рд╣реИрдВ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд "рдПрдХ рдмрд╛рд░" рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреЗ рдЫрд╣ рдорд╣реАрдиреЗ рдмрд╛рдж, рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рд▓реЗрдЦрдХ рд╕реЗ рдкреВрдЫрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рдлрд▓ рдХреНрдпреЛрдВ рд╣реИ, рддреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓реЗрдЦрдХ рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкреНрд░рд▓реЗрдЦрди рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдХреЛрдб рдореЗрдВ рд╣рд╛рд░реНрдбрдХреЛрдб рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рднреА рд▓реЙрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд▓реНрджреА рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдПред

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрд▓реНрджрдмрд╛рдЬреА рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХреБрдЫ рдмреЗрд╣рддрд░ рдореЗрдВ рдмрджрд▓рдирд╛ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдЕрд░реНрдерд╛рддреН, рдРрд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдХреЛрдб рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ рдЬреЛ рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЬреЛ рдЗрд╕рдХреЗ рд▓реЗрдЦрдХ рдФрд░ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИред
рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓реЗрдЦрдХ, рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдЖрдЬ рд╣рдо рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд▓рд╛рд╕рд┐рдХ
рдлрд╝рд┐рдЬрд╝ рдмрдЬрд╝ рдЯреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ "рдкрд░рд┐рд╡рд░реНрддрди" рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдп рд╡рд┐рд╢реЗрд╖ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреА рдЬрдЧрд╣, 1 рд╕реЗ 100 рддрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИред рддреЛ, рдпрджрд┐ рд╕рдВрдЦреНрдпрд╛ 3 рдХреА рдПрдХ рдмрд╣реБ рд╣реИ - рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ
Fizz
рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрджрд┐ рд╕рдВрдЦреНрдпрд╛ 5 рдХреА рдПрдХ рдмрд╣реБ рд╣реИ - рд╕реНрдЯреНрд░рд┐рдВрдЧ
Buzz
, рдФрд░ рдпрджрд┐ рдпреЗ рджреЛрдиреЛрдВ рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рдорд┐рд▓рддреА рд╣реИрдВ -
FizzBuzz
ред
рд╕реНрд░реЛрдд рдХреЛрдб
рдпрд╣рд╛рдБ рдПрдХ рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИ рдЬреЛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ:
import sys for n in range(int(sys.argv[1]), int(sys.argv[2])): if n % 3 == 0 and n % 5 == 0: print("fizzbuzz") elif n % 3 == 0: print("fizz") elif n % 5 == 0: print("buzz") else: print(n)
рдЖрдЗрдП рдЗрд╕реЗ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред
рдкреНрд░рд▓реЗрдЦрди
рдореБрдЭреЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рд▓реЗрдЦрди рд▓рд┐рдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓ рддрдХ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рджреЗрд░реА рдирд╣реАрдВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдЗрд╕рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рджреЗрддреА рд╣реИред рд╢реЗрд╖ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдЕрдЧрд▓рд╛ рдХрд╛рд░реНрдп рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкрд╛рд░рд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдореЗрдВ рд╣рд╛рд░реНрдбрдХреЛрдб рдХрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣
argparse рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╕реАрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реАрдорд╛ рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ "рдлрд╝рд┐рдЬрд╝" рдФрд░ "рдмрдЬрд╝" рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВред
import argparse import sys class CustomFormatter(argparse.RawDescriptionHelpFormatter, argparse.ArgumentDefaultsHelpFormatter): pass def parse_args(args=sys.argv[1:]): """Parse arguments.""" parser = argparse.ArgumentParser( description=sys.modules[__name__].__doc__, formatter_class=CustomFormatter) g = parser.add_argument_group("fizzbuzz settings") g.add_argument("--fizz", metavar="N", default=3, type=int, help="Modulo value for fizz") g.add_argument("--buzz", metavar="N", default=5, type=int, help="Modulo value for buzz") parser.add_argument("start", type=int, help="Start value") parser.add_argument("end", type=int, help="End value") return parser.parse_args(args) options = parse_args() for n in range(options.start, options.end + 1):
рдЗрди рдмрджрд▓рд╛рд╡реЛрдВ рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХрд╛рдлреА рдлрд╛рдпрджрд╛ рд╣реЛрддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдм рдареАрдХ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИрдВ, рдЖрдк
--help
рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕реА рдХрдорд╛рдВрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкрд┐рдЫрд▓реЗ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдореЗрдВ рд╣рдордиреЗ рдЬреЛ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рд▓рд┐рдЦрд╛ рдерд╛ рд╡рд╣ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реИ:
$ ./fizzbuzz.py --help usage: fizzbuzz.py [-h] [--fizz N] [--buzz N] start end Simple fizzbuzz generator. This script prints out a sequence of numbers from a provided range with the following restrictions: - if the number is divisible by 3, then print out "fizz", - if the number is divisible by 5, then print out "buzz", - if the number is divisible by 3 and 5, then print out "fizzbuzz". positional arguments: start Start value end End value optional arguments: -h, --help show this help message and exit fizzbuzz settings: --fizz N Modulo value for fizz (default: 3) --buzz N Modulo value for buzz (default: 5)
argparse
рдореЙрдбреНрдпреВрд▓ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░
рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореБрдЭреЗ
рдЙрдк -
рд╕рдореВрд╣ рдФрд░ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рдореВрд╣реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЙрдирдХреА рдХреНрд╖рдорддрд╛ рдкрд╕рдВрдж
рд╣реИ ред
рд▓реЙрдЧрд┐рдВрдЧ
рдпрджрд┐ рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╕реЗ рд▓реИрд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрдЦрдж рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЛрдЧрд╛ред
рд▓реЙрдЧрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
import logging import logging.handlers import os import sys logger = logging.getLogger(os.path.splitext(os.path.basename(sys.argv[0]))[0])
рддрдм рд╣рдо рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджреЗрдВрдЧреЗред рддреЛ,
logger.debug()
рдХрдорд╛рдВрдб рдХреЛ рдХреБрдЫ рддрднреА рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ
--debug
рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдПред рдпрджрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ
--silent
рд╕рд╛рде рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЕрдкрд╡рд╛рдж рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ
parse_args()
:
рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рдореЗрдВ рдирд┐рдореНрди рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВ:
def setup_logging(options): """Configure logging.""" root = logging.getLogger("") root.setLevel(logging.WARNING) logger.setLevel(options.debug and logging.DEBUG or logging.INFO) if not options.silent: ch = logging.StreamHandler() ch.setFormatter(logging.Formatter( "%(levelname)s[%(name)s] %(message)s")) root.addHandler(ch)
рдореБрдЦреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:
if __name__ == "__main__": options = parse_args() setup_logging(options) try: logger.debug("compute fizzbuzz from {} to {}".format(options.start, options.end)) for n in range(options.start, options.end + 1):
рдпрджрд┐ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкреНрд░рддреНрдпрдХреНрд╖ рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
crontab
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЗрд╕рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ
syslog
рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
def setup_logging(options): """Configure logging.""" root = logging.getLogger("") root.setLevel(logging.WARNING) logger.setLevel(options.debug and logging.DEBUG or logging.INFO) if not options.silent: if not sys.stderr.isatty(): facility = logging.handlers.SysLogHandler.LOG_DAEMON sh = logging.handlers.SysLogHandler(address='/dev/log', facility=facility) sh.setFormatter(logging.Formatter( "{0}[{1}]: %(message)s".format( logger.name, os.getpid()))) root.addHandler(sh) else: ch = logging.StreamHandler() ch.setFormatter(logging.Formatter( "%(levelname)s[%(name)s] %(message)s")) root.addHandler(ch)
рд╣рдорд╛рд░реА рдЫреЛрдЯреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рдХреЛрдб рдХреА рдПрдХ рд╕рдорд╛рди рд░рд╛рд╢рд┐ рдХреЗрд╡рд▓
logger.debug()
рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд▓рдЧрддреА рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рд┐рдкрд┐рдпреЛрдВ рдореЗрдВ рдпрд╣ рдХреЛрдб рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛ рдФрд░ рдЗрд╕рд╕реЗ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд▓рд╛рдн рд╕рдмрд╕реЗ рдЖрдЧреЗ рдЖрдПрдЧрд╛, рдЕрд░реНрдерд╛рддреН рдЗрд╕рдХреА рдорджрдж рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдкреНрд░рдЧрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд▓рдЧрд╛ рдкрд╛рдПрдВрдЧреЗред
$ ./fizzbuzz.py --debug 1 3 DEBUG[fizzbuzz] compute fizzbuzz from 1 to 3 1 2 fizz
рдкрд░реАрдХреНрд╖рдг
рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧреА рдЙрдкрдХрд░рдг рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡реИрд╕рд╛ рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рдЙрдиреНрд╣реЗрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпреВрдирд┐рдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЕрдХреНрд╕рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЙрдирдХрд╛ рд╕рдорд╛рд╡реЗрд╢ рдХреЛрдб рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рдо рд▓реВрдк рдХреЗ рдЕрдВрджрд░ рдХреЛрдб рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрдИ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:
def fizzbuzz(n, fizz, buzz): """Compute fizzbuzz nth item given modulo values for fizz and buzz. >>> fizzbuzz(5, fizz=3, buzz=5) 'buzz' >>> fizzbuzz(3, fizz=3, buzz=5) 'fizz' >>> fizzbuzz(15, fizz=3, buzz=5) 'fizzbuzz' >>> fizzbuzz(4, fizz=3, buzz=5) 4 >>> fizzbuzz(4, fizz=4, buzz=6) 'fizz' """ if n % fizz == 0 and n % buzz == 0: return "fizzbuzz" if n % fizz == 0: return "fizz" if n % buzz == 0: return "buzz" return n
рдЖрдк
pytest
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$ python3 -m pytest -v --doctest-modules ./fizzbuzz.py ============================ test session starts ============================= platform linux -- Python 3.7.4, pytest-3.10.1, py-1.8.0, pluggy-0.8.0 -- /usr/bin/python3 cachedir: .pytest_cache rootdir: /home/bernat/code/perso/python-script, inifile: plugins: xdist-1.26.1, timeout-1.3.3, forked-1.0.2, cov-2.6.0 collected 1 item fizzbuzz.py::fizzbuzz.fizzbuzz PASSED [100%] ========================== 1 passed in 0.05 seconds ==========================
рдпрд╣ рд╕рдм рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╛рдо рдХреЗ рдмрд╛рдж рдЖрдиреЗ рдХреЗ рд▓рд┐рдП
.py
рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╛рдореЛрдВ рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЬреЛрдбрд╝рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛: рднрд╛рд╖рд╛ рдХреЗрд╡рд▓ рдПрдХ рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг рд╣реИ рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╛рдо рдХреЛ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рд▓реИрд╕ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐
pytest
, рдХреЛрдб рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдвреВрдВрдвреЗрдВред
рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐
pytest
рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рдХреЗ рд╕реНрдерд╛рди рдФрд░ рд╕рдорд╕реНрдпрд╛ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:
$ python3 -m pytest -v --doctest-modules ./fizzbuzz.py -k fizzbuzz.fizzbuzz ============================ test session starts ============================= platform linux -- Python 3.7.4, pytest-3.10.1, py-1.8.0, pluggy-0.8.0 -- /usr/bin/python3 cachedir: .pytest_cache rootdir: /home/bernat/code/perso/python-script, inifile: plugins: xdist-1.26.1, timeout-1.3.3, forked-1.0.2, cov-2.6.0 collected 1 item fizzbuzz.py::fizzbuzz.fizzbuzz FAILED [100%] ================================== FAILURES ================================== ________________________ [doctest] fizzbuzz.fizzbuzz _________________________ 100 101 >>> fizzbuzz(5, fizz=3, buzz=5) 102 'buzz' 103 >>> fizzbuzz(3, fizz=3, buzz=5) 104 'fizz' 105 >>> fizzbuzz(15, fizz=3, buzz=5) 106 'fizzbuzz' 107 >>> fizzbuzz(4, fizz=3, buzz=5) 108 4 109 >>> fizzbuzz(4, fizz=4, buzz=6) Expected: fizz Got: 4 /home/bernat/code/perso/python-script/fizzbuzz.py:109: DocTestFailure ========================== 1 failed in 0.02 seconds ==========================
рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдирд┐рдпрдорд┐рдд рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рднреА рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
def main(options): """Compute a fizzbuzz set of strings and return them as an array.""" logger.debug("compute fizzbuzz from {} to {}".format(options.start, options.end)) return [str(fizzbuzz(i, options.fizz, options.buzz)) for i in range(options.start, options.end+1)]
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╣рдо
рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ
pytest
рд▓рд┐рдП
pytest
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг
pytest
:
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐, рдЪреВрдВрдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб
sys.exit()
рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
parse_args()
рдЗрдХрд╛рдИ рдХреЛ
parse_args()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдореЗрдВ рд╡рд╣ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ
main()
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
expected
рдЗрдХрд╛рдИ рдХреА рддреБрд▓рдирд╛
main()
ред рдЕрдЧрд░ рд╕рдм рдХреБрдЫ рдЙрдореНрдореАрдж рдХреЗ
pytest
рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдмрддрд╛рдПрдВрдЧреЗ:
$ python3 -m pytest -v --doctest-modules ./fizzbuzz.py ============================ test session starts ============================= platform linux -- Python 3.7.4, pytest-3.10.1, py-1.8.0, pluggy-0.8.0 -- /usr/bin/python3 cachedir: .pytest_cache rootdir: /home/bernat/code/perso/python-script, inifile: plugins: xdist-1.26.1, timeout-1.3.3, forked-1.0.2, cov-2.6.0 collected 7 items fizzbuzz.py::fizzbuzz.fizzbuzz PASSED [ 14%] fizzbuzz.py::test_main[0 0-expected0] PASSED [ 28%] fizzbuzz.py::test_main[3 5-expected1] PASSED [ 42%] fizzbuzz.py::test_main[9 12-expected2] PASSED [ 57%] fizzbuzz.py::test_main[14 17-expected3] PASSED [ 71%] fizzbuzz.py::test_main[14 17 --fizz=2-expected4] PASSED [ 85%] fizzbuzz.py::test_main[17 20 --buzz=10-expected5] PASSED [100%] ========================== 7 passed in 0.03 seconds ==========================
рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ
pytest
рдХреНрдпрд╛ рд╣реБрдЖ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛:
$ python3 -m pytest -v --doctest-modules ./fizzbuzz.py [...] ================================== FAILURES ================================== __________________________ test_main[0 0-expected0] __________________________ args = '0 0', expected = ['0'] @pytest.mark.parametrize("args, expected", [ ("0 0", ["0"]), ("3 5", ["fizz", "4", "buzz"]), ("9 12", ["fizz", "buzz", "11", "fizz"]), ("14 17", ["14", "fizzbuzz", "16", "17"]), ("14 17 --fizz=2", ["fizz", "buzz", "fizz", "17"]), ("17 20 --buzz=10", ["17", "fizz", "19", "buzz"]), ]) def test_main(args, expected): options = parse_args(shlex.split(args)) options.debug = True options.silent = True setup_logging(options) assert main(options) == expected E AssertionError: assert ['fizzbuzz'] == ['0'] E At index 0 diff: 'fizzbuzz' != '0' E Full diff: E - ['fizzbuzz'] E + ['0'] fizzbuzz.py:160: AssertionError ----------------------------- Captured log call ------------------------------ fizzbuzz.py 125 DEBUG compute fizzbuzz from 0 to 0 ===================== 1 failed, 6 passed in 0.05 seconds =====================
рдЗрд╕ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ
logger.debug()
рдХрдорд╛рдВрдб рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ
logger.debug()
рд╢рд╛рдорд┐рд▓ рд╣реИред рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рдПрдХ рдФрд░ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИред рдпрджрд┐ рдЖрдк
pytest
рдХреА рдорд╣рд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ
рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
рдкрд░рд┐рдгрд╛рдо
рдЗрди рдЪрд╛рд░ рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ рдЖрдк рдкрд╛рдпрдерди рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
- рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕реНрдерд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рд▓реИрд╕ рдХрд░реЗрдВред
- рдЙрди рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
argparse
рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ argparse
рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред - рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрдЪрд╛рд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
logging
рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред - рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВред
рдпрд╣рд╛рдБ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреВрд░рд╛ рдХреЛрдб рд╣реИред рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЖрд╕рдкрд╛рд╕ рджрд┐рд▓рдЪрд╕реНрдк рдЪрд░реНрдЪрд╛ рд╢реБрд░реВ рд╣реБрдИ - рдЖрдк рдЙрдиреНрд╣реЗрдВ
рдпрд╣рд╛рдВ рдФрд░
рдпрд╣рд╛рдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рджрд░реНрд╢рдХреЛрдВ рдХреЛ, рдпрд╣ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдкрд░ рдФрд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рддрд░реНрдХреЛрдВ рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдкрд╛рдардХреЛрдВ рдХреЛ рд▓реЙрдЧрд┐рдВрдЧ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ "рдЧреМрд░реИрдпрд╛ рдкрд░ рддреЛрдк рд╕реЗ рдЧреЛрд▓реА рдорд╛рд░ рджреА рдЧрдИред"
рдпрд╣рд╛рдВ рд╡рд╣ рд╕рд╛рдордЧреНрд░реА рд╣реИ рдЬреЛ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рдереАред
рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдкреНрд░рдХрд╛рд╢рди рдореЗрдВ рджреА рдЧрдИ рдкрд╛рдпрдерди рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ?
