⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parseargs.py

📁 bittorrent source by python. please enjoy
💻 PY
字号:
# The contents of this file are subject to the BitTorrent Open Source License# Version 1.1 (the License).  You may not copy or use this file, in either# source code or executable form, except in compliance with the License.  You# may obtain a copy of the License at http://www.bittorrent.com/license/.## Software distributed under the License is distributed on an AS IS basis,# WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the License# for the specific language governing rights and limitations under the# License.# Written by Bill Bumgarner and Bram Cohen# Dave's comments:# makeHelp has no less than 4 elif's based on uiname. Doh.## I like the function parseargs.  It makes no UI-specific assumptions.from types import *from BitTorrent.translation import _from BitTorrent.obsoletepythonsupport import *from BitTorrent import BTFailurefrom BitTorrent.bencode import bdecodefrom BitTorrent.platform import is_frozen_execlass UsageException(BTFailure):    passdef makeHelp(uiname, defaults):    ret = u''    ret += (_("Usage: %s ") % uiname)    if uiname.startswith('launchmany'):        ret += _("[OPTIONS] [TORRENTDIRECTORY]\n\n")        ret += _("If a non-option argument is present it's taken as the value\n"                 "of the torrent_dir option.\n")    elif uiname == 'bittorrent-tracker' or 'test-client':        ret += _("OPTIONS")    elif uiname == 'bittorrent':        ret += _("[OPTIONS] [TORRENTFILES]\n")    elif uiname.startswith('bittorrent'):        ret += _("[OPTIONS] [TORRENTFILE]\n")    elif uiname.startswith('maketorrent'):        ret += _("[OPTION] TRACKER_URL FILE [FILE]\n")    ret += '\n'    ret += _("arguments are -\n") + formatDefinitions(defaults, 80)    return retdef printHelp(uiname, defaults):    print makeHelp(uiname, defaults)def formatDefinitions(options, COLS):    s = u''    indent = u" " * 10    width = COLS - 11    if width < 15:        width = COLS - 2        indent = " "    for option in options:        (longname, default, doc) = option        if doc == '':            continue        s += u'--' + longname        is_boolean = type(default) is bool        if is_boolean:            s += u', --no_' + longname        else:            s += u' <arg>'        s += u'\n'        if default is not None:            doc += _(u" (defaults to ") + repr(default) + u')'        i = 0        for word in doc.split():            if i == 0:                s += indent + word                i = len(word)            elif i + len(word) >= width:                s += u'\n' + indent + word                i = len(word)            else:                s += u' ' + word                i += len(word) + 1        s += u'\n\n'    return sdef usage(str):    raise UsageException(str)def format_key(key):    if len(key) == 1:        return '-%s'%key    else:        return '--%s'%keydef parseargs(argv, defaults, minargs=None, maxargs=None, presets=None):    """This function parses command-line arguments and uses them to override       the presets which in turn override the defaults (see defaultargs.py).       As currently used, the presets come from a config file (see       configfile.py).       Options have the form:          --option value       where the word option is replaced with the option name, etc.       If a string or number appears on the line without being preceeded       by a --option, then the string or number is an argument.       @param argv: command-line arguments. Command-line options override          defaults and presets.       @param defaults: list of (optionname,value,documentation) 3-tuples.       @param minargs: minimum number of arguments in argv.       @param maxargs: maximum number of arguments in argv.       @param presets: a dict containing option-value pairs.  Presets          typically come from a config file.  Presets override defaults.       @return: the pair (config,args) where config is a dict containing          option-value pairs, and args is a list of the arguments in the          order they appeared in argv.       """    assert type(argv)==list    assert type(defaults)==list    assert minargs is None or type(minargs) in (int,long) and minargs>=0    assert maxargs is None or type(maxargs) in (int,long) and maxargs>=minargs    assert type(presets)==dict    config = {}    for option in defaults:        longname, default, doc = option        config[longname] = default    args = []    pos = 0    if presets is None:        presets = {}    else:        presets = presets.copy()    while pos < len(argv):        if argv[pos][:1] != '-':             # not a cmdline option            args.append(argv[pos])            pos += 1        else:            key, value = None, None            if argv[pos].startswith('--'):        # --aaa 1                if argv[pos].startswith('--no_'):                    key = argv[pos][5:]                    boolval = False                else:                    key = argv[pos][2:]                    boolval = True                if key not in config:                    raise UsageException(_("unknown option ") + format_key(key))                if type(config[key]) is bool: # boolean cmd line switch, no value                    value = boolval                    pos += 1                else: # --argument value                    if pos == len(argv) - 1:                        usage(_("parameter passed in at end with no value"))                    key, value = argv[pos][2:], argv[pos+1]                    pos += 2            elif argv[pos][:1] == '-':                key = argv[pos][1:2]                if len(argv[pos]) > 2:       # -a1                    value = argv[pos][2:]                    pos += 1                else:                        # -a 1                    if pos == len(argv) - 1:                        usage(_("parameter passed in at end with no value"))                    value = argv[pos+1]                    pos += 2            else:                raise UsageException(_("command line parsing failed at ")+argv[pos])            presets[key] = value    parse_options(config, presets, None)    config.update(presets)    # if a key appears in the config with a None value then this is because    # the key appears in the defaults with a None value and the value was    # not provided by the user.  keys appearing in defaults with a none    # value are REQUIRED arguments.    for key, value in config.items():        if value is None:            usage(_("Option %s is required.") % format_key(key))    if minargs is not None and len(args) < minargs:        usage(_("Must supply at least %d arguments.") % minargs)    if maxargs is not None and len(args) > maxargs:        usage(_("Too many arguments - %d maximum.") % maxargs)    return (config, args)def parse_options(defaults, newvalues, encoding):    """Given the type provided by the default value, this tries to cast/convert       the corresponding newvalue to the type of the default value.       By calling eval() on it, in some cases!       Entertainly, newvalue sometimes holds strings and, apparently,       sometimes holds values which have already been cast appropriately.       This function is like a boat made of shit, floating on a river of shit.       @param defaults: dict of key-value pairs where value is the default.       @param newvalues: dict of key-value pairs which override the default.       """    assert type(defaults) == dict    assert type(newvalues) == dict    for key, value in newvalues.iteritems():        if not defaults.has_key(key):            raise UsageException(_("unknown option ") + format_key(key))        try:            t = type(defaults[key])            if t is bool:                if value in ('True', '1', True):                    value = True                else:                    value = False                newvalues[key] = value            elif t in (StringType, NoneType):                # force ASCII                newvalues[key] = value.decode('ascii').encode('ascii')            elif t in (IntType, LongType):                if value == 'False':                    newvalues[key] == 0                elif value == 'True':                    newvalues[key] == 1                else:                    newvalues[key] = int(value)            elif t is FloatType:                newvalues[key] = float(value)            elif t in (ListType, TupleType, DictType):                if type(value) == StringType:                    try:                        n = eval(value)                        assert type(n) == t                        newvalues[key] = n                    except:                        newvalues[key] = t()            elif t is UnicodeType:                if type(value) == StringType:                    try:                        newvalues[key] = value.decode(encoding)                    except:                        newvalues[key] = value.decode('ascii')            else:                raise TypeError, str(t)        except ValueError, e:            raise UsageException(_("wrong format of %s - %s") % (format_key(key), unicode(e.args[0])))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -