很长一段时间以来,我一直试图找出将标志传递给 python 函数的最佳方法。最直接的方法是这样的:
def func(data, flag1, flag2, flag3):
...
func(my_data, True, False, True)
这确实很好而且简洁,但是非常难以阅读,因为单词“True”或“False”没有告诉您正在设置的标志,并且您必须从左侧开始仔细计算参数。您可以将它们设为关键字参数:
def func(data, flag1=False, flag2=False, flag3=False):
...
func(my_data, flag1=True, flag3=True)
但这有点多余,因为“True”根本没有任何意义。我可以将其作为列表传递:
func(mydata, ['flag1', 'flag3'])
or
func(mydata, [func.flag1, func.flag3])
但第一个感觉相当脏,使用字符串作为标志,第二个仍然有些重复。理想情况下我想说的是:
func(my_data, flag1, flag3)
以最少的冗长和冗余将标志传递给函数。有没有办法在 python 中做这样的事情?
编辑:
我最终选择了:
func(mydata, flagA=1, flagB=1)
主要是出于提到的原因:编译时检查(相对于传递字符串)、无命名空间污染(相对于使用全局“ENUM”)和最小样板文件(=1 或 =0 只有 2 个字符,而 5 或 6 个字符) =真或=假)。它还使得设置标志的默认值变得非常容易:
def func(data, flagA=1, flagB=0, flagC=1):
...
这比跳过圈子来提取默认值并将其分配给 **kwarg 风格的标志要清晰得多,也容易得多。这些标志基本上是静态检查的并且写起来非常清晰/干净。现在如果我能把最后两个字符删掉就好了……