python3 通过终端选项执行方法(对sys.argv的封装)

import sys


class Exists(Exception):
    def __init__(self, msg, opt=''):
        super(Exists, self).__init__(msg, opt)
        self.msg = msg

    def __str__(self):
        return self.msg


class SysArgs(object):

    def __init__(self):
        self.__par_name = []
        self.__required = []
        self.__long_options = {}
        self.__help_dict = {}
        self.__func_dict = {}
        self.__long_short = {}
        self.__args = {}
        self.__parameter_list = []
        self.add_par('H', 'helper', helper='Get helper')
        self.add_par('h', 'helper', helper='Get helper')

    def add_par(self, options: str, long_options: str = None, helper: str = None, func=None, required: bool = False,
                parameter: bool = False, **args):
        if options in self.__par_name:
            raise Exists('%s is exists' % options)
        if helper:
            self.__help_dict[options] = helper
        if func:
            self.__func_dict[options] = func
        if required:
            self.__required.append(options)
        if long_options:
            self.__long_short[long_options] = options
            self.__long_options[options] = long_options
        if parameter:
            self.__parameter_list.append(options)
            self.__par_name.append(options)
        else:
            self.__par_name.append(options)
        if args:
            self.__args[options] = args

    def args(self):
        self.opt = self.getopt()
        for name, value in self.opt:
            if name == '-h' or name == '-H' or name == '--helper':
                self.__helper()
                continue
            name = name[1:]
            if name.startswith('-'):
                name = name[1:]
                self.__dict__[name] = value
                name = self.__long_short[name]
            if name in self.__long_options:
                self.__dict__[self.__long_options[name]] = value
            self.__dict__[name] = value
        self.__func()

    def __throw_error(self, par):
        print('error: %s' % par)
        exit()

    def __helper(self):
        print(f'{"briefness":<15}{"complete":<20}{"describe"}', end='\n\n')
        for name in self.__par_name:
            if name == ':' or name == 'H':
                continue
            long_options = ''
            if name in self.__long_options:
                long_options = '--' + self.__long_options[name]
            if name == 'h':
                print(f'-{name.lower() + " " + name.upper():<9}{long_options:<20}{self.__help_dict[name]}')
                continue
            if name in self.__help_dict:
                print(f'{"-" + name:<10}{long_options:<20}{self.__help_dict[name]}')
                continue
            print(f'{"-" + name:<10}{long_options}')
        exit()

    def __func(self):
        for name, value in self.opt:
            name = self.__swap(name)
            if name in self.__func_dict and name in self.__args:
                self.__func_dict[name](*self.__args[name]['args'])
            elif name in self.__parameter_list and name in self.__dict__ and self.__dict__[name]:
                self.__func_dict[name](*self.__dict__[name])
            else:
                self.__func_dict[name]()

    def getopt(self):
        parameters = sys.argv[1:]
        _args = []
        _is = []
        seed = 0
        for element in parameters:
            if element.startswith('-') or element.startswith('--'):
                seed += 1
                _is.append(element)
                _args.append((element, []))
                par = element
                par = self.__swap(par)
                if par not in self.__par_name:
                    self.__throw_error('Parameter %s is not recognized' % element)
                continue
            _args[seed - 1][1].append(element)
        for par, vales in _args:
            arg = par
            par = self.__swap(par)
            if par in self.__parameter_list and not vales:
                self.__throw_error(' %s option missing parameters' % arg)

        for required in self.__required:
            if required not in _is:
                self.__throw_error('%s Can not be omitted' % required)
        return _args

    def __swap(self, par):
        par = par[1:]
        if par.startswith('-') and par[1:] in self.__long_short:
            par = self.__long_short[par[1:]]
        return par

示列:

def main(par):
    print(par)


if __name__ == '__main__':
    sys = SysArgs()
    sys.add_par('t', func=main, parameter=True, helper="测试")
    sys.args()

终端:

$ python3 test.py -t HELLO
HELLO # 输出

获取终端值

from sysArgs import SysArgs


def main():
    print(sys.t)


if __name__ == '__main__':
    sys = SysArgs()
    sys.add_par('t', helper="测试")
    sys.args()

终端:

$ python3 test.py -t HELLO WORLD
['HELLO', 'WORLD']  # 输出

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值