如何区分默认参数和提供默认值的参数?
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)
假设我的函数 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)