定义和使用元组作为默认参数

时间:2017-08-02 07:52:58

标签: python-3.x default-parameters

我已经四处寻找,但我的细节无法确定。我正在编写一个函数,它接受一个必需参数和两个带有默认值的可选参数,其中一个参数需要是一个元组:

def real_titlecase(lineString, delimiter = ' ', no_caps = do_not_cap):

如果没有传入,我希望no_caps参数元组默认为do_not_cap。我的问题是我想在函数本身中定义do_not_cap,它包含大约50个项目:

do_not_cap = ('A','a','AN','An','an','THE','The','the', . . . )

我试图将do_not_cap定义为函数def顶部docstring下的第一项,但我得到:

NameError: name 'do_not_cap' is not defined

当我调用该函数时。我假设python在标题中遇到do_not_cap并且不知道它是从干草捆中知道的,因为它尚未定义。为了便于阅读,我真的不想在标题中定义该元组,我希望它封装在函数中,以便它可以正常运行作为默认值。

那我怎么能这样做呢?

谢谢!

1 个答案:

答案 0 :(得分:1)

需要在定义函数时定义函数的默认值。您无法使用仅在运行该功能时创建的值,这太晚了。

有两种可能的解决方案。一种是在函数之外定义默认值元组(可能在它之前):

do_not_cap = ('A', 'a', 'AN', 'An', 'an', 'THE', 'The', 'the', ...)

def real_titlecase(lineString, delimiter=' ', no_caps=do_not_cap):
    ...

如果您想阻止元组的其他用途(例如,您不希望它的名称成为您的API的一部分),您可能希望使用"私有"名称以下划线为前缀(例如_do_not_cap而不是do_not_cap)。

另一种选择是使用特殊的标记值(例如None)作为默认值。在函数的顶部,您可以检查标记,并在所需的元组中替换它。您需要选择一个不会成为用户提供的有效参数的标记。 None适用于您的示例函数,但在其他情况下,如果用户传入None可能是有意义的参数,则可能需要使用不同的标记。

def real_titlecase(lineString, delimiter=' ', no_caps=None):
    if no_caps is None:
        no_caps = ('A', 'a', 'AN', 'An', 'an', 'THE', 'The', 'the', ...)
    ...