Python:向函数传递标志

2024-04-18 22:41:10 发布

您现在位置:Python中文网/ 问答频道 /正文

很长一段时间以来,我一直试图找出将标志传递给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样式标志的默认值要清楚得多,也容易得多。标记基本上是静态检查的,写起来非常清晰/干净。现在我要是能把最后两个字删掉就好了。。。


Tags: 方法函数字符串falsetruedatamy标志
3条回答

带*参数:

def some_func(data, *args):
    # do something
    return args # this is just to show how it works


>>> print some_func(12, 'test', 'test2', 'test3')
('test', 'test2', 'test3')

这是一个很好的问题,可以理解*args和**kwargs是如何工作的:*args and **kwargs?

可以将flag1flagN定义为全局变量,并使用func( *args)定义函数

FLAG1 = 1
FLAG2 = 2

def func(*args):
   pass

func(FLAG1, FLAG2)

通过分别定义标志,而不是使用字符串,可以避免标志名称中的错误和调试时的一些麻烦

一些Python标准库使用此选项:

re.match(pattern, str, re.MULTILINE | re.IGNORECASE)

您可以使用*args调整此方法:

my.func(a, b, c, my.MULTLINE, my.IGNORECASE)

我真的建议使用flag1=True:

  • 它是可读的
  • 在编译时检查标志名(除非使用**kwargs)
  • 可以使用flag=1和flag=0而不是True和False来减少噪声
  • 您可以临时将LONG_FLAG_NAME_you_DONT_REMEMBER=True更改为False,而无需在需要更改时重新键入LONG NAME

相关问题 更多 >