推荐用于函数参数处理的Python模块?

Jon*_*ice 5 python parsing arguments

有许多Python模块用于解析和协调命令行选项(argparse,getopt,blargs等).Python拥有良好的内置功能/习惯用于处理各种函数参数(例如,默认值,*varargs,**keyword_args).但是,当我阅读各种项目的顶级函数代码时,我发现函数参数的规则和标准化明显少于命令行参数.

对于简单的功能,这不是问题; 内置的参数功能非常有用,并且绰绰有余.但是有很多功能丰富的模块,它们的顶层函数提供了许多不同的参数和选项(一些互补或独占),不同的操作模式,默认值,过载等等 - 也就是说,它们具有参数复杂性接近命令行参数.他们似乎在很大程度上以临时方式处理他们的论点.

鉴于命令行处理模块的数量,以及它们随着时间的推移变得多么精致,我期望至少有一些模块可以简化复杂函数参数的争论.但我搜索了PyPi,stackoverflow和谷歌没有成功.那么......你会推荐使用函数(不是命令行!)参数处理模块吗?

---用例子更新---

很难给出一个真正简单的具体示例,因为在处理复杂模块之前,用例不会出现.但是这里是解释代码中的问题的一个镜头:一个格式化程序模块,其默认值可以在格式化程序实例化中重写,或者在调用函数/方法时.由于只有几个选项,已经有大量的选项处理措辞,并且选项名称会重复出现令人作呕.

defaults = { 'indent':     4,
              'prefix':    None,
              'suffix':    None,
              'name':      'aFormatter',
              'reverse':   False,
              'show_name': False
            }

class Formatter(object):

    def __init__(self, **kwargs):
        self.name    = kwargs.get('name',    defaults['name'])
        self.indent  = kwargs.get('indent',  defaults['indent'])
        self.prefix  = kwargs.get('prefix',  defaults['prefix'])
        self.suffix  = kwargs.get('suffix',  defaults['suffix'])
        self.reverse = kwargs.get('reverse', defaults['reverse'])
        self.show_name = kwargs.get('show_name', defaults['show_name'])

    def show_lower(self, *args, **kwargs):
        indent = kwargs.get('indent', self.indent) or 0
        prefix = kwargs.get('prefix', self.prefix) 
        suffix = kwargs.get('suffix', self.suffix)
        reverse = kwargs.get('reverse', self.reverse)
        show_name = kwargs.get('show_name', self.show_name)

        strings = []
        if show_name:
            strings.append(self.name + ": ")
        if indent:
            strings.append(" " * indent)
        if prefix:
            strings.append(prefix)
        for a in args:
            strings.append(a.upper() if reverse else a.lower())
        if suffix:
            strings.append(suffix)
        print ''.join(strings)

if __name__ == '__main__':
    fmt = Formatter()
    fmt.show_lower("THIS IS GOOD")
    fmt.show_lower("THIS", "IS", "GOOD")
    fmt.show_lower('this IS good', reverse=True)
    fmt.show_lower("something!", show_name=True)

    upper = Formatter(reverse=True)
    upper.show_lower("this is good!")
    upper.show_lower("and so is this!", reverse=False)
Run Code Online (Sandbox Code Playgroud)

Mik*_*ham 1

如果您的 API 非常复杂,您认为使用某些模块来处理传递给您的选项会更容易,那么实际的解决方案很可能是简化您的 API。事实上,有些模块有非常复杂的方式来调用东西,这是一种耻辱,而不是一个特性。