Тема: Передача параметрів в Python
Є 2 типи параметрів: опції та аргументи (обов'язкові). Перед тим як почати потрібно зрозуміти в чому різниця між опціями та аргументами.
Опції - необов'язкові параметри, які передаються в програму. На початку потрібно ставити символ "-" для коротких опцій, і символ "--" для довгих.
Наприклад, програму яка друкує кількість символів у файлі можна запускати з опцією -x або --extended:
./calculate_symbols.py -x
./calculate_symbols.py --extended
Також можна, наприклад, додати ще опцію яка не буде враховувати пробільні символи.
Аргументи - це обов'язкові параметри, які передаються в програму. В розглянутому више прикладі, це може бути ім'я файлу (шлях), в якому потрібно підрахувати кількість символів
./calculate_symbols.py test.txt
./calculate_symbols.py /Users/replace/test.txt
Перейдемо до коду. Обробляти параметри можна за допомогою бібліотеки argparse, але спочатку напишемо код без її використання.
#!/usr/bin/python
# -*- coding: utf8 -*-
# Copyright 2012 Replace.org.ua
"""
Невелика програма для підрахунку кількості символів в файлі
Опції: -x --extended - додатково показує кількість маленьких та великих літер
"""
import sys
def calculate_symbols():
# Перевіряємо кількість параметрів
if len(sys.argv) >= 2:
filename = sys.argv[1] # шлях до файлу
else:
print 'Filename expected'
exit(0)
is_extended = False
# Перевіряємо чи є опції
if len(sys.argv) >= 3:
options = sys.argv[2:] # наші опції
for option in options:
if option == '-x' or option == '--extended':
is_extended = True
else:
print 'Unexpected option', option
# Читаємо з файла
try:
f = open(filename)
data = f.read()
f.close()
except:
print 'File', filename, 'not found.'
exit(0)
print 'File', filename, 'has', len(data), 'symbols.',
if is_extended:
print 'Lower case letters:', str(calculate_lower(data)) + '. Upper case:', calculate_upper(data)
else:
print
def calculate_upper(data):
#кількість великих літер
count = 0
for ch in data:
if ch > 'A' and ch < 'Z':
count += 1
return count
def calculate_lower(data):
#кількість мельких літер
count = 0
for ch in data:
if ch > 'a' and ch < 'z':
count += 1
return count
if __name__ == '__main__':
calculate_symbols()
Те саме але з використанням бібліотеки argparse (Python >= 2.7 and >= 3.2):
#!/usr/bin/python
# -*- coding: utf8 -*-
# Copyright 2012 Replace.org.ua
"""
Невелика програма для підрахунку кількості символів в файлі з використанням бібліотеки argparse
Опції: -x --extended - додатково показує кількість маленьких та великих літер
"""
import argparse
def calculate_symbols():
# створюємо об'єкт parser
parser = argparse.ArgumentParser()
parser.add_argument('filename') # обов'язковий параметр filename
parser.add_argument('-x','--extended', help='display extended informatiion', action='store_true') # якщо вказати -/-- на початку парсер сам зрозуміє, що це опція
# записуємо параметри в args
args = vars(parser.parse_args()
is_extended = args['extended']
filename = args['filename']
# Читаємо з файла
try:
f = open(filename)
data = f.read()
f.close()
except:
print 'File', filename, 'not found.'
exit(0)
print 'File', filename, 'has', len(data), 'symbols.',
if is_extended:
print 'Lower case letters:', str(calculate_lower(data)) + '. Upper case:', calculate_upper(data)
else:
print
def calculate_upper(data):
#кількість великих літер
count = 0
for ch in data:
if ch > 'A' and ch < 'Z':
count += 1
return count
def calculate_lower(data):
#кількість мельких літер
count = 0
for ch in data:
if ch > 'a' and ch < 'z':
count += 1
return count
if __name__ == '__main__':
calculate_symbols()
Бібліотека argparse має велику кількість можливостей. Більш детально можна почитати в документації http://docs.python.org/dev/library/argparse.html А так взагалі мені більше довподопи писати свій велосипед.
Приклади використання:
Без параметрів:
./test.py
usage: test.py [-h] [-x] filename
test.py: error: too few arguments
help:
./test.py -h
usage: test.py [-h] [-x] filename
positional arguments:
filename
optional arguments:
-h, --help show this help message and exit
-x, --extended display extended informatiion
Нормальний режим роботи:
./test.py test.py
File test.py has 1750 symbols.
З опцією extended:
./test.py test.py -x
File test.py has 1750 symbols. Lower case letters: 555. Upper case: 7
Можете попрактикуватись переробивши додавши ще одну опцію, тоді буде враховуватись тільки пробільні символи.
Написано для Replace.org.ua