很长一段时间以来,我一直试图找出将标志传递给python函数的最佳方式。最直接的方法是:
def func(data, flag1, flag2, flag3):
...
func(my_data, True, False, True)
这是非常好和简洁,但难以置信的难读,因为“真”或“假”一词告诉你什么标志正在设置,你必须仔细计算从左边开始的论点。您可以使它们成为关键字参数:
def func(data, flag1=False, flag2=False, flag3=False):
...
func(my_data, flag1=True, flag3=True)
但这有点多余,因为“真的”根本没有任何意义。我可以把它作为一个列表:
func(mydata, ['flag1', 'flag3'])
或者
func(mydata, [func.flag1, func.flag3])
但第一种感觉相当肮脏,使用字符串作为标记,第二种感觉仍然有些重复。理想情况下,我想说:
func(my_data, flag1, flag3)
将标志传递给具有最小冗余和冗余的函数。在python中有没有类似的方法?
编辑: 我最终选择了:
func(mydata, flagA=1, flagB=1)
主要原因是:编译时检查(与传递字符串相比)、没有名称空间污染(与使用全局“枚举”相反)和最小的样板文件(=1或=0仅为2个字符,而5或6表示=True或=False)。它还使设置标志的默认值变得非常容易:
def func(data, flagA=1, flagB=0, flagC=1):
...
这比跳过环来提取和指定**kwarg样式标志的默认值要清楚得多,也容易得多。标记基本上是静态检查的,写起来非常清晰/干净。现在我要是能把最后两个字删掉就好了。。。
带*参数:
这是一个很好的问题,可以理解*args和**kwargs是如何工作的:*args and **kwargs?
可以将
flag1
…flagN
定义为全局变量,并使用func( *args)
定义函数通过分别定义标志,而不是使用字符串,可以避免标志名称中的错误和调试时的一些麻烦
一些Python标准库使用此选项:
您可以使用*args调整此方法:
我真的建议使用flag1=True:
相关问题 更多 >
编程相关推荐