如何区分默认参数和提供默认值的参数?

How to distinguish default argument and argument provided with default value?

假设我的函数 f 如下:

def f(c=None):
    return 42 if c is None else c

那我就None出不了这个函数了。现在您可能会想“好吧,只需检查另一个值,例如 2128.213 或其他值”,但我无法从函数中获取特定值,可以吗?

这就是为什么我想尽可能区分 f()f(None) 以便我可以

f() -> 42
f(None)-> None

请记住,这是一个简化的示例。在实践中,它是一个 class 的 __init__(...) 函数,带有多个位置参数,在此示例中我想将其处理为 c

在这种情况下的常见做法是使用您永远不想使用的特定标记值 return。

class Sentinel():
    pass


_sentinel = Sentinel()

# _sentinel = object()  # this is the option too

def f(x=_sentinel):
    return 42 if x is _sentinel else x

assert f() == 42
assert f(None) is None
assert f(5) == 5

您可以利用 Python 的私有属性:为该私有属性分配一个新对象,比较参数是否为私有对象,然后完成。

class somename:
    __default = object()
    def __init__(self, default=__default):
        print(42 if default is self.__default else default)

somename()
somename(default=12)