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