【发布时间】:2015-05-12 02:28:31
【问题描述】:
我正在写一个有点像这样的函数:
def parse(string, default=None):
try:
... # Body of function here
except ParseError:
if default is not None:
return default
raise
但是,如果我真的希望函数返回 None,就会遇到问题。
if len(sys.argv) > 4:
if flag.ignore_invalid:
result = parse(sys.argv[4], None) # Still raises error
else:
result = parse(sys.argv[4])
我试图解决的问题是:
_DEFAULT = object()
def parse(string, default=_DEFAULT):
...
if default is not _DEFAULT:
...
但这似乎是我想多了,而且似乎有更简单的方法。
any 和 all 函数执行此操作(默认允许 None),但我不知道如何。
【问题讨论】:
-
如果
None不合适,object是一个合理的前哨 - 请注意,您可以使用default=object(即类)而不是default=_DEFAULT(一个实例)来节省额外的任务。object is object也可以避免使用奇怪的__eq__实现的返回值问题。相关:stackoverflow.com/q/1118454/3001761 -
您的
_DEFAULT是一个非常合理的选择。 -
默认值只需要是一个永远不能是调用者传递的有效参数的值。自定义实例效果很好,因为调用者虽然理论上可以创建一个与您的哨兵等于的对象,但他永远无法创建一个
is您的哨兵。如果他显式调用该方法并引用您的哨兵,那么这几乎不是您的问题:)
标签: python function default-parameters