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

Defining and using a tuple as a default parameter

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

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

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

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

我试图将 do_not_cap 定义为函数 def 顶部文档字符串下的第一项,但我得到:

NameError: name 'do_not_cap' is not defined

当我调用函数时。我假设 python 在 header 中遇到 do_not_cap 并且不知道它来自一捆干草,因为它还没有被定义。为了可读性,我真的不想在 header、 中定义那个元组,我希望它封装在函数中,这样它就可以作为默认值正常运行.

那我该怎么做呢?

谢谢!

函数的默认值需要在定义函数的时候定义。您不能使用仅在函数为 运行 时才创建的值,那太晚了。

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

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

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

如果您想阻止元组的其他用途(例如,您不希望它的名称成为您的 API 的一部分),您可能希望使用 "private" 名称前缀下划线(例如 _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', ...)
    ...