Модуль argparse предлагает способ сделать это, не выполняя свои собственные проверки обязательности. В приведенном ниже примере используются «subparsers» или «sub команды». Я реализовал подпапку для «дампа» и один для «формата».
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('file', help='The file you want to act on.')
subparsers = parser.add_subparsers(dest='subcommand')
# subparser for dump
parser_dump = subparsers.add_parser('dump')
# add a required argument
parser_dump.add_argument(
'format',
choices=['csv', 'json'],
help='Dump the file in this format.')
# subparser for upload
parser_upload = subparsers.add_parser('upload')
# add a required argument
parser_upload.add_argument(
'server',
choices=['amazon', 'imgur'],
help='Upload the file to this service.')
args = parser.parse_args()
print args
if args.subcommand == 'dump':
print 'I will now dump "%s" in the %s format' % (args.file, args.format)
if args.subcommand == 'upload':
print 'I will now upload "%s" to %s' % (args.file, args.server)
Это выглядит так в командной строке:
$ python ap.py
usage: ap.py [-h] file {upload,dump} ...
ap.py: error: too few arguments
$ python ap.py tmp.txt
usage: ap.py [-h] file {upload,dump} ...
ap.py: error: too few arguments
$ python ap.py tmp.txt upload
usage: ap.py file upload [-h] {amazon,imgur}
ap.py file upload: error: too few arguments
$ python ap.py tmp.txt upload amazo
usage: ap.py file upload [-h] {amazon,imgur}
ap.py file upload: error: argument server: invalid choice: 'amazo' (choose from 'amazon', 'imgur')
$ python ap.py tmp.txt upload amazon
Namespace(file='tmp.txt', server='amazon', subcommand='upload')
I will now upload "tmp.txt" to amazon
$ python ap.py tmp.txt upload imgur
Namespace(file='tmp.txt', server='imgur', subcommand='upload')
I will now upload "tmp.txt" to imgur
$ python ap.py tmp.txt dump
usage: ap.py file dump [-h] {csv,json}
ap.py file dump: error: too few arguments
$ python ap.py tmp.txt dump csv
Namespace(file='tmp.txt', format='csv', subcommand='dump')
I will now dump "tmp.txt" in the csv format
$ python ap.py tmp.txt dump json
Namespace(file='tmp.txt', format='json', subcommand='dump')
I will now dump "tmp.txt" in the json format
Дополнительная информация: http://docs.python.org/dev/library/argparse.html#argparse. ArgumentParser.add_subparsers
Вы можете централизовать DVCS. Разница между DVCS и централизованными состоит в том, что с DVCS у вас нет , у вас для его централизации.
У вас может быть центральный репозиторий, где каждый может отправлять изменения, и каждый может извлекать последний код из. Вы можете написать ловушку фиксации на сервере, чтобы каждый раз, когда кто-то нажимает код, он запускал тест, чтобы убедиться, что он проходит тесты. Это похоже на централизованное управление версиями, только лучше, потому что я могу создать локальную ветвь и сделать несколько локальных коммитов, прежде чем я буду готов к отправке на центральный сервер.
Вы когда-нибудь вносили большие изменения, которые ломают многие из вещи и хотели сделать несколько коммитов, но не делиться ими, пока не закончите и все снова не исправите? Это то, что упрощает DVCS.
Это действительно усложняет выполнение CI, так как система управления версиями поощряет вас НЕ выполнять непрерывную интеграцию. Однако нет ничего, что мешало бы вам выполнить эту регулярную интеграцию в центральный репозиторий. Команда просто должна оставаться дисциплинированной в этом отношении.
Если небольшие команды разветвляют проект и какое-то время занимаются своими делами, вам также следует выполнять сборки непрерывной интеграции с этой вилкой и, возможно, настроить регулярную интеграцию между двумя вилками.
Это похоже на многоступенчатые стратегии непрерывной интеграции на основе потоков, которые продвигает Accurev:
http://www.accurev.com/multistage-continuous-integration.html