我已经四处寻找,但我的细节无法确定。我正在编写一个函数,它接受一个必需参数和两个带有默认值的可选参数,其中一个参数需要是一个元组:
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并且不知道它是从干草捆中知道的,因为它尚未定义。为了便于阅读,我真的不想在标题中定义该元组,和我希望它封装在函数中,以便它可以正常运行作为默认值。
那我怎么能这样做呢?
谢谢!
答案 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', ...)
...