Определить функцию для выполнения из используемой опции - PullRequest
0 голосов
/ 23 марта 2011

Как параметры / аргументы определяют, какая функция выбрана во время выполнения программы? Для примера у меня есть две опции, в зависимости от опции, которую я хотел бы, чтобы они использовали свои соответствующие функции. Чего мне не хватает?

import os, sys, glob
from optparse import OptionParser

def fname(arguments):
    files = []
    for arg in arguments:
        if '*' in arg or '?' in arg:
            # contains a wildcard character
            files.extend(glob.glob(arg))
        elif os.path.isdir(arg):
            # is a dictionary
            files.extend(glob.glob(os.path.join(arg, '*')))
        elif os.path.exists(arg):
            # is a file
            files.append(arg)
        else:
            # invalid?
            print '%s invalid' % arg
    return files

# check if file exists locally, if not: download it
def downnload(filename, keyString):
    if not os.path.exists(filename+keyString):
        l.get_contents_to_filename(filename+keyString)

# List bucket contents
def blist(bucket):
    for b in rs:
        print b.name

def main():
    usage = "usage: %prog [options] -f filename"
    parser = OptionParser(usage)
    parser.add_option('-d', '--download',
            action='store', dest='download',
            default=None, help='download files from cloud')
    parser.add_option('-l', '--list',
            action='store', dest='bucket',
            default=None, help='list buckets or contents of specified bucket')

    if len(sys.argv) == 1:
        parser.print_help()
        sys.exit()
    (options, args) = parser.parse_args()

    # from boto import
    bucket_list = bucket.list()
    for l in bucket_list:
        keyString = str(l.key)

    downnload(options.filename, keyString)
    blist(options.bucket)

if __name__ == '__main__':
    main()

1 Ответ

1 голос
/ 23 марта 2011

Вы много скучаете.

  1. Где filename дано значение?
  2. Где keyString дано значение?
  3. Где bucket дано значение?
  4. Вы не должны называть свою функцию list, так как это примитивный тип

Возможно, вы захотите взглянуть на optparse учебник . Я предполагаю, что вы ожидаете, что bucket получит значение из аргумента командной строки --list. Вместо этого значение сохраняется в options.bucket. Это только начало.

Я думаю, что вы хотите изменить конец main, чтобы проверить опции и вызвать соответствующую функцию. Что-то вроде:

def main():
    # much omitted
    if options.filename is not None:
        downnload(options.filename, keyString)
    elif options.bucket is not None:
        blist(options.bucket)
    else:
        print 'Either --download or --list is required.'
        parser.print_help()
        sys.exit(-1)

Я думаю, что это то, что вы ищете. Он решает, какую функцию вызывать, основываясь на переданных аргументах командной строки. Например, если пользователь передает --download filename, то вызывается функция downnload с указанным именем файла в качестве аргумента.

...