定义和使用元组作为默认参数
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', ...)
...
我四处寻找,但无法确定我的详细信息。我正在编写一个函数,它接受一个必需参数和两个具有默认值的可选参数,其中一个需要是一个元组:
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', ...)
...