2017-08-02 137 views
0

我已经开始探索,但对于我的详细信息无能为力。我正在写一个函数,使用默认值一个必需的和两个可选参数,其中一个必须是一个元组:定义并使用一个元组作为默认参数

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

我想no_caps参数元组为默认值,如果没有被传递给do_not_cap。我的问题是,我想在函数内部定义do_not_cap,它包含约五十项:

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

我曾试图定义do_not_cap作为高清功能的顶部的文档字符串下的第一个项目,但我得到:

NameError: name 'do_not_cap' is not defined 

当我调用该函数。我假设python在头文件中遇到了do_not_cap,并且从一捆干草中不知道它,因为它还没有被定义。为了便于阅读,我真的不想在头文件中定义该元组,我希望它封装在函数中,以便它可以正常工作为默认值。

那么我该如何做到这一点?

谢谢!

回答

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', ...) 
    ... 
+0

使用哨兵工作完美。任何人都不可能通过“无” - 如果他们想要默认行为,他们会放弃参数。至少这就是文档串会说的。 –